我已经开始学习 Numpy,我正在寻找一些方法来编写这个。我写了欧拉 1 的概括。它需要一个除数列表和一个数字,例如欧拉 1 中的 [3, 5] 和 1000。
在纯python中天真地:
def subn1(divisors, n):
return sum(i for i in range(1,n) if not all(i % d for d in divisors))
对于范围(2,20),1000000,这将在大约 2.5 秒内运行。
到目前为止,我的第一个也是最好的 numpy 尝试如下所示:
def subn2(divisors, n):
a = np.arange(1,n)
b = np.zeros(a.shape[0], dtype=bool)
for d in divisors:
b += a % d == 0
return np.sum(a[b])
对于范围(2,20),1000000,运行时间约为 0.45 秒。
我的第三次尝试是删除 foo 循环并使用纯 numpy,但是它在速度部门中丢失了一小部分并且使用了更多内存。
def subn3(divisors, n):
nums = np.arange(1,n)
divs = np.array([divisors]).T
return np.sum(nums[np.logical_or.reduce(np.mod(nums, divs) == 0, axis=0)])
对于范围(2,20),100000,这将在大约 0.5 秒内运行。
有没有一种更快的方法可以在“纯”numpy 中编写它,或者是 foo 循环不要回避?
注意:我知道您可以通过减少除数列表来优化它,因此无需对此发表评论:)