【发布时间】:2020-04-08 20:49:27
【问题描述】:
我正在运行一个示例 python 模拟来预测加权和常规骰子。我想使用 numba 来帮助加速我的脚本,但我收到一个错误:
<timed exec>:6: NumbaWarning:
Compilation is falling back to object mode WITH looplifting enabled because Function "roll" failed type inference due to: Untyped global name 'sum': cannot determine Numba type of <class 'builtin_function_or_method'>
File "<timed exec>", line 9:
<source missing, REPL/exec in use?>
这是我的原始代码:我可以使用另一种类型的 numba 表达式吗?现在我正在使用 2500 卷的输入进行测试;想把这个时间缩短到 4 秒(目前是 8.5 秒)。
%%time
from numba import jit
import random
import matplotlib.pyplot as plt
import numpy
@jit
def roll(sides, bias_list):
assert len(bias_list) == sides, "Enter correct number of dice sides"
number = random.uniform(0, sum(bias_list))
current = 0
for i, bias in enumerate(bias_list):
current += bias
if number <= current:
return i + 1
no_of_rolls = 2500
weighted_die = {}
normal_die = {}
#weighted die
for i in range(no_of_rolls):
weighted_die[i+1]=roll(6,(0.15, 0.15, 0.15, 0.15, 0.15, 0.25))
#regular die
for i in range(no_of_rolls):
normal_die[i+1]=roll(6,(0.167, 0.167, 0.167, 0.167, 0.167, 0.165))
plt.bar(*zip(*weighted_die.items()))
plt.show()
plt.bar(*zip(*normal_die.items()))
plt.show()
【问题讨论】:
-
如果您只是想要更快的模拟,您可以使用random.choices 生成 weighted_die 和 normal_die 的列表。
-
你能举个例子吗?随意使用我的代码并随意更改。
-
@LeeWhieldon——提供了一个代码示例。但是,不明白您为什么说代码需要 8.5 秒才能运行。我得到了几毫秒的时间(不包括绘图)。
-
@DarrylG,谢谢!这确实提高了性能。欣赏!