2015-10-18 96 views
0

huge_list參數類似於[[12,12,14],[43,356,23]]。我的代碼轉換列表設置爲:爲什麼在Cython中將列表轉換爲集需要很多時間?

cpdef list_to_set(list huge_list): 
    cdef list ids 
    cdef list final_ids=[] 
    for ids in huge_list: 
     final_ids.append(set(ids)) 

    return final_ids 

我有2800個列表元素,每個有30,000個id。大約需要19秒。如何提高性能?


EDIT 1:
代替set我在numpy使用unique如下面和numpy速度高達通過〜7秒:

df['ids'] = df['ids'].apply(lambda x: numpy.unique(x)) 

現在需要14秒(以前有人〜 20秒)。我不認爲這一次是可以接受的。 :|

+0

1)'final_ids'是一個列表,而不是一個集合? 2)'my_set = set(some_list)'有什麼問題(不使用Cython)? – DavidW

+0

@DavidW,TypeError:不可用類型:'list'。 – ALH

+0

夠公平的,這是有道理的。不知道你的代碼上面的作品雖然(final_ids沒有更新,我認爲?) – DavidW

回答

0

如果你只是要轉換的嵌套列表設置,你可以簡單地使用map功能:

final_ids=map(set,huge_list) 
+0

正如我所說這些效率不高。我把我的集合轉換成'numpy array'並且用'numpy.unique'處理重複的東西,我節省了7秒,但是還不能接受。 – ALH

+0

@AlirezaHos你說的那個?這與你所做的完全不同。你可以說使用map的時候出了什麼問題,這是完成這個任務最Python的方法! – Kasramvd

+0

我沒有: - |我不是在尋找一種最蟒蛇式的方式來處理我的問題,我正在尋找一種解決方案,比19秒更少的時間。我很欣賞你穿上這件衣服的時間。 – ALH

1

用Cython不能加快什麼。花費最多的時間是建立集合,例如計算元素的散列值並將它們存儲在地圖中。這已經在C中完成了,所以沒有加速的可能。純蟒蛇版本:

final_ids = [set(ids) for ids in huge_list] 

會導致相同的結果。

+0

我使用了'df ['ids'] = df ['ids']。apply(lambda x:numpy.unique(x))',它加速了大約7秒。但需要更多改進。這不可能嗎?人們如何管理他們的龐大數據呢? – ALH

相關問題