【发布时间】:2020-11-19 21:34:55
【问题描述】:
出于性能原因,我经常使用 numba,而对于我的代码,我需要随机抽取样本而不进行替换。我发现,我可以为此使用 numpy.random 函数,但我注意到它与 random.sample 函数相比非常慢。难道我做错了什么?如何提高 numba 功能的性能?我将我的代码归结为这个最小的例子:
import numpy as np
import numba as nb
def func2():
List = range(100000)
for x in range(20000):
random.sample(List, 10)
@nb.njit()
def func3():
Array = np.arange(100000)
for x in range(20000):
np.random.choice(Array, 10, False)
print(timeit(lambda: func2(), number=1))
print(timeit(lambda: func3(), number=1))
>>>0.1196
>>>20.1245
编辑:我现在使用自己的示例函数,比 np.random.choice 快得多。
@nb.njit()
def func4():
for x in range(20000):
rangeList = list(range(100000))
result = []
for x in range(10):
randint = random.randint(0, len(rangeList) - 1)
result.append(rangeList.pop(randint))
return result
print(timeit(lambda: func4(), number=count))
>>>0.1767
【问题讨论】:
-
性能下降
replace=False,尝试设置为True -
是的,但我想拥有它而无需更换!
-
这不是我问题的真正答案。
-
它解释了为什么随机样本有时比 numpys 随机选择更快。还有如何通过使用
np.random.default_rng().choice来克服这个问题。你在问你是否做错了什么,答案是:取决于
标签: python performance numba