Ben func
fonksiyonun performansını artırmak için çalışıyordum ve aX
listenin nasıl basit bir değişiklik Performansın biraz iyileştirdiğini bulundu:Neden rastgele bir listeyi sipariş edilen bir listeyi işlemeden çok daha hızlı işliyor?
import timeit
import numpy as np
def func(a, b):
return [_ for _ in a if _ not in b]
Na, Nb = 10000, 5000
b = list(np.random.randint(1000, size=Nb))
# Ordered list of Na integers
a1 = [_ for _ in range(Na)]
# Random list of Na integers
a2 = list(np.random.randint(Na, size=Na))
# Ordered list of Na integers generated with numpy
a3 = list(np.arange(Na))
start_time = timeit.default_timer()
ab1 = func(a1, b)
abt1 = timeit.default_timer() - start_time
print("Time ab1", abt1)
start_time = timeit.default_timer()
ab2 = func(a2, b)
abt2 = timeit.default_timer() - start_time
print("Time ab2", abt2)
start_time = timeit.default_timer()
ab3 = func(a3, b)
abt3 = timeit.default_timer() - start_time
print("Time ab3", abt3)
print("Ratio 1/2:", abt1/abt2)
print("Ratio 1/3:", abt1/abt3)
Python 2.7.13 bu sonuçlanır: Python
('Time ab1', 5.296088933944702)
('Time ab2', 1.5520200729370117)
('Time ab3', 1.5581469535827637)
('Ratio 1/2:', 3.412384302428827)
('Ratio 1/3:', 3.3989662667998095)
farkı 3.5.2
bile büyüktür:Time ab1 6.758207322000089
Time ab2 1.5693355060011527
Time ab3 1.5148192759988888
Ratio 1/2: 4.306413317073784
Ratio 1/3: 4.461395117608107
Sorum şu yüzden: (
a1
veya
a3
yani):Bir
sıralı liste tamsayılar işlenmesi gerektiği
Neden rastgele liste numpy
ile oluşturulan sıralı liste değil çok daha hızlı işlenir?
Bu aptalca bir soru olabilir, ancak * işleyemezsiniz * veya * siparişi * listeyi ** yeniden sipariş veremez misiniz? –
Bu adil bir test midir? "A1" listesindeki maksimum değer 10000 (listenin uzunluğu) olacaktır; burada "a2" listesindeki maksimum değer, 0 ile 1000 arasında rastgele bir sayı olacağı için 1000 olacaktır. _ _ aralığında (Na) için] 'ile' a1 = [_ // 10 aralığında (Na) için] '4.6 oranının neden daha hızlı olduğundan hala emin değildir. Ya da belki de bunu yanlış anladım. –
@ Alessi42 geçerli bir noktadır. Bu farkı düzeltmek için soruyu düzenleyeceğim. Teşekkür ederim! – Gabriel