En kısa kod satırı kullanımı ile asal sayıları bulma

Merhaba, ben de ufak bir fikir vermek isterim.

era = [0 for i in range(1001)]
for i in range(2, 1001):
    if(era[i] == 0):
        print(i)
        k = i + i
        while(k < 1001):
            era[k] = 1
            k += i

Eratosthenes kalburu. Sıklıkla kullanılır.
Öğrencinizin kodunu aşağıdaki gibi düzeltsek daha optimize olur.

from math import sqrt
for i in range (2,1000):
    for a in range (2,int(sqrt(i))):
        if (i%a)==0:
            break
    else:
        print (i,end=", ")

Neyse her üç kodu da test edelim(testin doğru sonucu vereceğini garanti edemeyiz ama aralık ne kadar büyük olursa doğruluk payı o kadar artar. O yüzden kodlarda ufak değişiklikler yaptım. Hatamız varsa affola.)

from timeit import timeit as tit

testcode1 = """
prime = []
era = [0 for i in range(1000001)]
for i in range(2, 1000001):
    if(era[i] == 0):
        prime.append(i)
        k = i + i
        while(k < 1000001):
            era[k] = 1
            k += i
"""

testcode2 = """
prime = []
from math import sqrt
for i in range (2,1000000):
    for a in range (2,int(sqrt(i))):
        if (i%a)==0:
            break
    else:
        prime.append(i)
"""

testcode3 = """
prime = []
for i in range (2,1000000):
    for a in range (2,i//2):
        if (i%a)==0:
            break
    else:
        prime.append(i)
"""



print("testcode1", tit(stmt = testcode1, number = 1))
print("testcode2", tit(stmt = testcode2, number = 1))
print("testcode3", tit(stmt = testcode3, number = 1))

outputs:

testcode1 0.3228799
testcode2 4.667852399999999
# [hesaplamasını bekliyorum, hesabı bitirebilirse editleme de yapacağım.]

Gerçekten ben de çok şaşırdım. Tesadüfe bak ki face gruplarından birinde daha böyle bir şey görmüştüm de kodu çalıştırmaya üşendiğimden(yani telde olduğumdan kodu çalıştırmadım) yanlış olduğunu düşünmüştüm. İlginç :thinking:

Edit: Sayın Seyirciler, Baylar ve bayanlar, işte karşınızdaaaa

testcode3 1398.2167295

Edit 2: Özür dilerim, tescode1 kodunu yeniden editledim. Ama yine de pek bir değişiklik olmadığını söyleyebilirim. Şöyle ki.

testcode1 0.46847779999999994
1 Beğeni