[英]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.