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ç
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