##Mock Data##
my_list = list(range(1700))
import itertools
cross_product = list(itertools.product(my_list,my_list))
station_combinations = ["_".join([str(i),str(b)]) for i,b in cross_product if i != b]
###############
from time import time,sleep
station_name = "5"
start = time()
for h in range(10):
reverse_indexes = [count for count,j in enumerate(station_combinations) if j.split("_")[1] == station_name ]
regular_indexes = [count for count,j in enumerate(station_combinations) if j.split("_")[0] == station_name ]
print(time() - start )
您好,我已經分享了上面的可重現代碼。
背景: 讓我快速介紹一下我的資料 station_combinations 是用符號“_”分隔的“my_list”的叉積。您可以將其視為“my_list”專案中的一個目的地,因此 1_2 將從 1 變為 2,而 2_1 將從 2 變為 1。
所以我將稱為“a_b” 在“reverse_indexes”中的所有組合中,我試圖找到(“a_b”)中的b等于“station_name”的元素的索引,所以“destination”等于station名稱,并且在 regular_indexes 中(“a_b”)源等于 station_name
問題: 我的代碼可以作業,但是速度很慢。如果您查看 for 回圈(使用游標 h),我會迭代 10 次,但是,在原始代碼中,它應該是大約。2000. 甚至 10 次迭代它大約。在我的電腦上需要 8 秒。我正在尋找顯著提高速度的方法。我已經嘗試了庫 numba,但是因為我實際上從資料框中獲取了一些資料,所以我無法使用“@njit”功能來解決它??。有人能幫忙嗎?
uj5u.com熱心網友回復:
一種解決方案是使用索引,在本例中為a和的兩個索引b。例如:
my_list = list(range(1700))
import itertools
cross_product = list(itertools.product(my_list, my_list))
station_combinations = [
"_".join([str(i), str(b)]) for i, b in cross_product if i != b
]
# precompute indexes:
index_a = {}
index_b = {}
for i, s in enumerate(station_combinations):
a, b = s.split("_")
index_a.setdefault(a, []).append(i)
index_b.setdefault(b, []).append(i)
from time import time, sleep
station_name = "5"
start = time()
for h in range(10):
reverse_indexes_new = index_b.get(station_name, [])
regular_indexes_new = index_a.get(station_name, [])
print(time() - start)
在我的機器上列印:
7.62939453125e-06
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531135.html
