2

nが素数の場合はTrueを返し、それ以外の場合はFalseを返す関数is_prime(n)があります。NumPy では、配列に素数が含まれているかどうかを確認してループしています。配列の先頭は反復ごとに同じになるため、多くの不要な計算を避けるためにis_prime(n)関数をメモ化したいと考えています。

配列があるので、 is_prime(n)をベクトル化したいので、要素ごとに NumPy スタイルの配列に適用できます。NumPy チュートリアル (後で表示) の 1 行でこれを行います。

ネットで見つけたメモ化テンプレートも使用します。

def memoize(function):
    cache = {}
    def decorated_function(*args):
        if args in cache:
            return cache[args]
        else:
            val = function(*args)
            cache[args] = val
            return val
    return decorated_function

それで:

is_prime = memoize(is_prime)

しかし、メモ化された is_prime関数をベクトル化すると、 V_primeは正しくメモ化されるようになりましたか?:

V_prime = np.vectorize(is_prime)

ありがとうございました

4

1 に答える 1

5

さて、それをテストしましょう。

import numpy as np

def test(input):
    return input

def memoize(function):
    cache = {}
    def decorated_function(*args):
        if args in cache:
            print 'cached'
            return cache[args]
        else:
            print 'not cached'
            val = function(*args)
            cache[args] = val
            return val
    return decorated_function

test = memoize(test)
print test(9)
print test(9)
test = np.vectorize(test)
print test(9)
print test(10)
print test(10)

私は自分のマシンでこれを取得します。

not cached
9
cached
9
cached
cached
9
not cached
10
cached
10

そうです、numpy 1.6.1を使用している私のマシンではmemoizeです

于 2012-06-14T20:25:57.870 に答える