有没有一种方法可以加快通过数组中某些元素调用各种函数的速度?在这里,我们想根据第3列的函数编号,对第2列的每个元素调用一个函数。
import numpy
a = numpy.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])
a
[[12 0 0 0 0]
[ 0 1 4 1 0]
[ 2 8 2 0 0]
[ 6 3 5 1 0]]
现在使用的For循环,随着行数的增加,速度变得非常慢。当行数达到数百万行时,就会升级到十几分钟才能完成。
for y in range(1, a.shape[0]+1):
exec('func{}()'.format(a[y, 2]))
def func4():
a[y, 1 ] = a[y, 1] + 2
def func2():
a[1, 1 ] = a[1, 1] + 1
def func5():
return
你可以试试。
my_func=eval('['+",".join(["func{}".format(x) for x in range(1,5+1)])+']')
or
my_func=[func0,func1,func2,func3,func4,func5]
for y in range(1, a.shape[0]+1):
my_func[a[y, 2]]()
为什么不干脆一个函数有多个分支?这样可以避免字符串格式化,如果你不想把所有的逻辑都放在一个函数中,你可以让它调用其他函数。你有没有试过,发现if检查太慢?
这段代码展示了如何通过一个主函数来分解它,它接受两个参数,并运行相应的代码或调用一个子函数。
import numpy as np
a = np.array([[12, 0, 0, 0, 0], [0, 1, 4, 1, 0], [2, 8, 2, 0, 0], [6, 3, 5, 1, 0]])
def main_func(c2_val, c3_val):
if c3_val == 0:
print("called with col3 value of 0")
# code for func you would call i.e.
a[c3_val, 1] = a[c3_val, 1] + 2
elif c3_val == 4: # on if for each possible outcome
# or have it call another function
func4()
# etc
def func4():
print("called with col3 value of 4")
for row in a:
print(row)
main_func(row[1], row[2])
注意:如果你真的担心运行时间,而且某些值的可能性比较大,请确保把它们放在更高的位置,这样需要的if检查就会减少。