Python:使用 list.sort(cmp=myfnc) 的内存高效列表
怎样才能让这段代码变得更好呢:
def my_func(x, y):
... do smth ...
return cmp(x',y')
my_list = range(0, N)
my_list.sort(cmp=my_func)
在内存使用上,Python 的列表比 numpy 数组要占用更多的空间(6800MB 对比 700MB),但是 numpy.array 没有带有比较函数的排序功能。
有没有其他方法可以减少内存使用,或者用我的比较函数来对 numpy 数组进行排序呢?
更新:我现在的解决方案是使用一个 C 语言的函数(通过 SWIG 共享)来对一个巨大的整数数组进行排序,然后再把排序后的结果返回给 Python。
不过我希望能找到一些方法,在 Python 中实现对大数据集的内存高效排序。有什么想法吗?
2 个回答
0
你可以用内置的 sorted
函数来处理 numpy 数组,作为一种替代方法:
>>> a = np.arange(10, 1, -1)
>>> sorted(a, cmp=lambda a,b: cmp(a,b))
[2, 3, 4, 5, 6, 7, 8, 9, 10]
不过要注意,这个方法不是在原地进行的,所以它会占用 1400 MB 的内存,而不是 6800 MB。
2
如果你能写一个叫做ufunc的函数来转换你的数组,那么你就可以通过argsort来快速排序:
b = convert(a)
idx = np.argsort(b)
sort_a = a[idx]