繁体   English   中英

如何计算一个函数被调用的次数?

[英]How do I count the number of times a function is called?

这是我的代码,我想做的是将我编写的函数逐列地应用于numpy数组。 要知道程序的进度,我想做类似的事情,如果i % 100 == 0: print i ,则可以在for循环中执行i % 100 == 0: print i

from sklearn.mixture import GMM

gmm = GMM(n_components=2)

def getFunc(x):
    print 1
    return gmm.fit_predict(np.expand_dims(x,axis=1))

newX = np.apply_along_axis(getFunc, 0, inputX)

您可以尝试为您的函数编写装饰器。

from functools import wraps
from sklearn.mixture import GMM

gmm = GMM(n_components=2)

def log_every(n):
    def decorator(fn)
        counter = 0
        @wraps(fn)
        def wrapper(*args, **kwargs):
            counter += 1
            if counter % n == 0:
                print(n)
            return fn(*args, **kwargs)
        return wrapper
    return decorator

@log_every(100)
def getFunc(x):
    return gmm.fit_predict(np.expand_dims(x,axis=1))

newX = np.apply_along_axis(getFunc, 0, inputX)

但是,正如@MarcusMüller指出的那样,性能可能会受到影响。

没有这样的工具-实际上,没有,因为apply_along_axis是一个单片调用(出于性能方面的考虑,这是一件好事),大多数情况下发生在C / CPython中。 没有任何工具可以将已经“处理”的项目数量返回给python –实际上,当考虑使用全局解释器锁定时,我什至不知道这种情况怎么发生。

因此,不,除非您的getFunc更新一个global计数器,否则这是getFunc -考虑到它实际上几乎是一个lambda,这可能会或可能不是一个好主意(如果使用,可能会提高速度lambda x: gmm.fit_predict(np.expand_dims(x, axis=1))而不是getFunc ,或者只使用np.vectorize !)。

global计数器应起作用,可变计数器也应起作用

Out[1471]: array([12, 15, 18, 21])
In [1472]: A=np.arange(12).reshape(3,4)
In [1473]: def foo(x):
      ...:     counter[0] +=1
      ...:     print(counter)
      ...:     return sum(x)
      ...: 
In [1474]: counter=[0]
In [1475]: np.apply_along_axis(foo,0,A)
[1]
[2]
[3]
[4]
Out[1475]: array([12, 15, 18, 21])

请注意,在这种情况下apply_along_axis

In [1476]: [sum(col) for col in A.T]
Out[1476]: [12, 15, 18, 21]
In [1477]: A.sum(axis=0)
Out[1477]: array([12, 15, 18, 21])

为什么要使用apply_along_axis inputX的维数是inputX

在二维情况下, apply_along_axis基本是:

[sum(A[(slice(None),i)]) for i in range(A.shape[1])]

如果A的维数较大,则它将对所有i,j...进行迭代(slice(None),i,j...) 但是还有其他生成这些索引的方法。 它提供了便利,而不是速度或功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM