【发布时间】:2017-09-21 04:07:14
【问题描述】:
我正在寻找一种有效的方法来计算 numpy 数组中的第 n 个最大值,this answer 将我引导至np.partition。
顺便说一句,我注意到对于少于 100 个条目的数组,朴素排序比 np.partition 方法更快。 (相反,对于大型数组,增益是显而易见的)
小数组的 np.partition 运行时间几乎持平的原因是什么?
生成图片的代码:
import pandas as pd
import numpy as np
import timeit
def func_1(inp):
return np.partition(inp, 10)[10]
def func_2(inp):
return np.sort(inp)[10]
a = []
b = []
N_tests = int(1e5)
for wdw in range(20, 1000, 10):
print wdw
res1 = timeit.timeit("func_1(test)",
setup = "import pandas as pd; import numpy as np; wdw_size = %d; test = np.random.randn(wdw_size); from __main__ import func_1"%wdw, number = N_tests)
a.append(res1)
res2 = timeit.timeit("func_2(test)",
setup = "import pandas as pd; import numpy as np; wdw_size = %d; test = np.random.randn(wdw_size); from __main__ import func_2"%wdw, number = N_tests)
b.append(res2)
import matplotlib.pyplot as plt
plt.plot(range(20,1000, 10), a, range(20, 1000, 10), b)
plt.legend(['np.partition', 'np.sort'])
plt.xlabel('Array Size')
plt.ylabel('Time')
【问题讨论】:
-
对于可靠的基准,也许对较小的数据集使用更多的迭代?
-
公平的建议。我已将迭代次数增加到 1e5,但仍获得相同的定性结果。
-
答案可能很简单,“因为设置分区的开销更大”,即使原则上不应该这样。或许看看源代码?
-
如果就地排序,时间比较如何?
-
func_1 和 func_2 都不使用 wdw 参数...
标签: python arrays performance sorting numpy