我試圖改善func
功能的性能,我發現是如何產生的aX
列表一個簡單的改變提高了性能相當多:爲什麼處理隨機列表比處理有序列表快得多?
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這導致:
('Time ab1', 5.296088933944702)
('Time ab2', 1.5520200729370117)
('Time ab3', 1.5581469535827637)
('Ratio 1/2:', 3.412384302428827)
('Ratio 1/3:', 3.3989662667998095)
在Python 3.5.2的差甚至更大:
Time ab1 6.758207322000089
Time ab2 1.5693355060011527
Time ab3 1.5148192759988888
Ratio 1/2: 4.306413317073784
Ratio 1/3: 4.461395117608107
我需要處理的有序列表整數(即:a1
或a3
),所以我的問題是:
爲什麼隨機列表處理,從而速度遠遠超過了有序列表不與numpy
產生的?
這可能是一個愚蠢的問題,但是在你完成了它的處理之後,你不能*重新排序*或者*排列* list * **嗎? –
這是一個公平的測試?列表'a1'中的最大值將是10000(列表的長度),其中列表'a2'中的最大值將是1000,因爲它將是0到1000之間的隨機數,因此將'a1 = [ _用於範圍(Na)]''用'a1 = [_ // 10用於範圍(Na)]'給出4.6的比率仍然不確定爲什麼它更快。或者我誤解了這一點。 –
@ Alessi42提出了一個有效的觀點。我將編輯這個問題來解決這個問題。謝謝! – Gabriel