Python 记忆NumPy矢量化函数

Python 记忆NumPy矢量化函数,python,numpy,Python,Numpy,我有一个函数is_prime(n),如果n是prime,则返回True,否则返回False。在NumPy中,我正在循环,检查数组是否包含素数,并且数组的开头在每次迭代中都是相同的,因此我想记住is_prime(n)函数,以避免大量不必要的计算 因为我有一个数组,所以我想将is_prime(n)矢量化,这样我就可以将它逐元素应用到数组中,以NumPy样式。我使用NumPy教程(稍后显示)中的一行代码完成此操作 我还使用了我在网上找到的备忘录模板: def memoize(function):

我有一个函数is_prime(n),如果n是prime,则返回True,否则返回False。在NumPy中,我正在循环,检查数组是否包含素数,并且数组的开头在每次迭代中都是相同的,因此我想记住is_prime(n)函数,以避免大量不必要的计算

因为我有一个数组,所以我想将is_prime(n)矢量化,这样我就可以将它逐元素应用到数组中,以NumPy样式。我使用NumPy教程(稍后显示)中的一行代码完成此操作

我还使用了我在网上找到的备忘录模板:

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函数向量化,那么V_prime现在是否正确记忆

V_prime = np.vectorize(is_prime)
谢谢

让我们来测试一下

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

所以是的,它是memoize,在我的机器上使用numpy 1.6.1

哦,好吧,那太聪明了!非常感谢。没问题,记忆化很酷,不过要小心,因为它会消耗相当多的内存,具体取决于您使用的对象类型。。。当内存不足或有一段时间没有访问对象时,人们倾向于使用专用对象而不是字典来控制/监视内存,并销毁/删除对象。
not cached
9
cached
9
cached
cached
9
not cached
10
cached
10