Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การวิเคราะห์วิธีการหาจำนวนเฉพาะใน Python: เปรียบเทียบประสิทธิภาพ

ในบทช่วยสอนนี้ เราจะดูวิธีการหาจำนวนเฉพาะ (Prime Number) แบบต่างๆ และเปรียบเทียบเวลาที่ใช้ในการทำงานของแต่ละวิธี โดยใช้โมดูล time ในการวัดเวลารัน

วิธีที่ 1: วิธีทั่วไป (Brute Force)

เป็นวิธีพื้นฐานในการหาจำนวนเฉพาะ

  • ถ้าเลขน้อยกว่าหรือเท่ากับ 1 ให้คืนค่า False
  • ถ้าเลขหารด้วยตัวเลขใดตัวหนึ่งลงตัว ให้คืนค่า False
  • หลังจบลูป ให้คืนค่า True

ตัวอย่างโค้ด

import time

def is_prime(n):
    if n <= 1:
        return False
    else:
        for i in range(2, n):
            if n % i == 0:
                return False
        return True

start_time = time.time()
primes = 0
for i in range(100000):
    if is_prime(i):
        primes += 1
print(f'Total primes in the range {primes}')

end_time = time.time()
print(f'Execution time: {end_time - start_time}')

ผลลัพธ์

Total primes in the range 9594
Execution time: 63.1301212310791

วิธีที่ 2: ลดจำนวนรอบลูปด้วยรากที่สอง

ในวิธีนี้ เราลดจำนวนรอบการวนลูปโดยตรวจสอบเฉพาะจนถึงรากที่สองของ n

ตัวอย่างโค้ด

import time
import math

def is_prime(n):
    if n <= 1:
        return False
    else:
        for i in range(2, int(math.sqrt(n)) + 1):
            if n % i == 0:
                return False
        return True

start_time = time.time()
primes = 0
for i in range(100000):
    if is_prime(i):
        primes += 1
print(f'Total primes in the range {primes}')

end_time = time.time()
print(f'Execution time: {end_time - start_time}')

ผลลัพธ์

Total primes in the range 9592
Execution time: 0.2039644718170166

วิธีที่ 3: ข้ามเลขคู่ (ยกเว้น 2)

เราทราบว่าเลขคู่ไม่ใช่จำนวนเฉพาะ (ยกเว้น 2) ดังนั้นเราสามารถข้ามเลขคู่ได้เพื่อลดเวลาลงอีก

ตัวอย่างโค้ด

import time
import math

def is_prime(n):
    if n <= 1:
        return False
    elif n == 2:
        return True
    elif n > 2 and n % 2 == 0:
        return False
    else:
        for i in range(3, int(math.sqrt(n)) + 1, 2):
            if n % i == 0:
                return False
        return True

start_time = time.time()
primes = 0
for i in range(100000):
    if is_prime(i):
        primes += 1
print(f'Total primes in the range {primes}')

end_time = time.time()
print(f'Execution time: {end_time - start_time}')

ผลลัพธ์

Total primes in the range 9592
Execution time: 0.10342741012573242

สรุป

จากการทดสอบพบว่า:

  • วิธีที่ 1 ใช้เวลา ~63 วินาที (ช้ามาก)
  • วิธีที่ 2 ใช้เวลา ~0.2 วินาที (เร็วกว่า ~300 เท่า)
  • วิธีที่ 3 ใช้เวลา ~0.1 วินาที (เร็วกว่าวิธีที่ 2 อีก 2 เท่า)

การเพิ่มประสิทธิภาพอัลกอริทึมส่งผลต่อประสิทธิภาพอย่างมาก หากมีข้อสงสัย สามารถถามได้ในส่วนความคิดเห็น