Numpy の学習を始めたので、これを書く方法を探しています。オイラー 1 の一般化を書きました。除数のリストと数値が必要です。たとえば、[3, 5] とオイラー 1 の 1000 です。
単純に純粋な python で:
def subn1(divisors, n):
return sum(i for i in range(1,n) if not all(i % d for d in divisors))
これは、range(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])
range(2,20)、1000000 の場合、約 0.45 秒で実行されます。
私の 3 番目の試みは、foor ループを削除して純粋な 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)])
これは、range(2,20)、100000 の場合、約 0.5 秒で実行されます。
「純粋な」numpyでそれを書くためのより速い方法はありますか、それとも恥ずかしがらないforループですか?
注:除数リストを減らすことで最適化できることはわかっているので、それについてコメントする必要はありません:)