buradaki sorunum küçük bir sayı girdiğimde hemen bulabiliyor fakat yüksek bir sayı girdiğimde anahtar değişkeni tek tek yükseldiği için süre uzuyor,bu süreyi kısaltmak için ne yapabilirim.
Şimdiden cevaplarınız için teşekkür ederim
Mesela aşağıdaki kodlar aşağı yukarı 5 saniyede 30000000 sayısını çarpanlarına ayırıyor. Sizin yazdığınız kodlara göre ise işlem aşağı yukarı 12 saniye sürüyor.
f = lambda x: map(lambda j: f"{j}, {x / j}", \
filter(lambda i: x % i == 0, range(1, x + 1, 1)))
for i in f(30000000):
print(i)
Aslında çarpanlara ayırma işlemi aşağıdaki kodlarla daha kısa sürer:
def f(n):
carpanlar = []
for i in range(1, n + 1, 1):
if divmod(n, i)[1] == 0:
x = [i, divmod(n, i)[0]]
if list(reversed(x)) not in carpanlar:
carpanlar.append(x)
else:
break
for i in reversed(carpanlar):
if list(reversed(i)) not in carpanlar:
carpanlar.append(list(reversed(i)))
return carpanlar
for i in f(30000000):
print(*i, sep=", ")
Yukarıdaki kodlara göre çarpanlara ayırma işleminin gerçekleşme süresi 0.002260446548461914 saniye olmuştur. Yani işlem 5 saniyeden 0.002260446548461914 saniyeye düştü.
Yukarıdaki kodları şu şekilde kısaca açıklayabilirim:
10 sayısının çarpanları aşağıdaki gibidir:
1, 10
2, 5
5, 2
10, 1
Şimdi yukarıda görüldüğü gibi bölenler bir yerden sonra bölüm olmaya başlayacak. Bölenin, bölüm olmaya başladığı yerde for döngüsü durdurulur. Sonra carpanlar listesine reversed(carpanlar) listesinin elemanları ters bir şekilde eklenir. Böylece çok kısa sürelerde çok büyük sayılar çarpanlarına ayrılabilir.