2015-10-18 70 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

相关问题