如何使用python高效地调用循环中的函数?

如何使用python高效地调用循环中的函数?,python,performance,function,loops,call,Python,Performance,Function,Loops,Call,我在解一个随机微分方程,我有一个函数,其中包含一个算法来解它。因此,我必须在每个时间步调用该函数(类似于Runge Kutta的方法,但使用随机变量),然后我必须多次解方程(因为解是随机的),才能对所有解进行平均。这就是为什么我想知道如何在每次迭代中以尽可能最有效的方式调用此函数。如果您使用for循环和range(),并且不使用每次迭代附带的数字,则可以使用下划线来节省一些效率: for _ in range(100): print("Function call")

我在解一个随机微分方程,我有一个函数,其中包含一个算法来解它。因此,我必须在每个时间步调用该函数(类似于Runge Kutta的方法,但使用随机变量),然后我必须多次解方程(因为解是随机的),才能对所有解进行平均。这就是为什么我想知道如何在每次迭代中以尽可能最有效的方式调用此函数。

如果您使用
for
循环和
range()
,并且不使用每次迭代附带的数字,则可以使用下划线来节省一些效率:

for _ in range(100):
    print("Function call")

如果您只打算在循环中使用函数,则可以直接传入正在使用的函数的内容,并消除对函数的定义以节省一些效率。

如果您将
用于
循环和
范围()
,而不使用每次迭代附带的数字,您可以使用下划线来节省一些效率:

for _ in range(100):
    print("Function call")

如果您只打算在循环中使用函数,则可以直接传入正在使用的函数的内容,并消除对函数的定义以节省一些效率。

在iterable上实现函数的最佳方法是使用
map
函数


由于
map
是用C编写的,并且经过高度优化,因此它的内部隐含循环可以比常规的Python for循环更有效。

在iterable上实现函数的最佳方法是使用
map
函数


由于
map
是用C编写的,并且经过高度优化,因此它的内部隐含循环可以比常规的Python for循环更有效。

根据您的使用情况,使用
itertools.starmap()
可能会更有利。您可以将
starmap()
看作是
map()
的多变量实现。你可以找到更多关于它的信息。其行为大致相当于:

def starmap(function, iterable):
    # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
    for args in iterable:
        yield function(*args)
所以你可以这样使用它:

from itertools import starmap

def myAddNumbers(a,b):
    return a+b

myListOfArgTuples = [(1,2), (3,4), (5,6)]
cosmicCartograph = starmap(myAddNumbers, myListOfArgs)
请注意,
starmap()
返回一个生成器对象,因此为了“执行”生成器,您需要实例化它:

myResultsList = list(cosmicCartograph)
# [3, 7, 11]


根据您的用例,使用
itertools.starmap()
可能是有利的。您可以将
starmap()
看作是
map()
的多变量实现。你可以找到更多关于它的信息。其行为大致相当于:

def starmap(function, iterable):
    # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
    for args in iterable:
        yield function(*args)
所以你可以这样使用它:

from itertools import starmap

def myAddNumbers(a,b):
    return a+b

myListOfArgTuples = [(1,2), (3,4), (5,6)]
cosmicCartograph = starmap(myAddNumbers, myListOfArgs)
请注意,
starmap()
返回一个生成器对象,因此为了“执行”生成器,您需要实例化它:

myResultsList = list(cosmicCartograph)
# [3, 7, 11]


优化函数调用的一些方法:

  • 如果函数参数和结果始终相同,请将函数调用移出循环
  • 如果某些函数参数重复且给定参数集的结果相同,请使用memoize或lru缓存
然而,既然您说您的应用程序是龙格库塔的一个变体,那么这两个都不可能起作用;您将有不同的t值和建模的状态向量,因此您必须在循环中调用函数,并且这些值不断变化

如果您的算法很慢,那么进行函数调用的效率就无关紧要了。看看优化函数以使其运行更快(或转换为Cython)——实际调用本身并不是瓶颈


编辑:我看到您多次运行此程序,以根据此模拟的随机性确定一系列值。在这种情况下,您应该使用多处理在不同的CPU内核上运行多个模拟-这将加快一些速度。

优化函数调用的一些方法:

  • 如果函数参数和结果始终相同,请将函数调用移出循环
  • 如果某些函数参数重复且给定参数集的结果相同,请使用memoize或lru缓存
然而,既然您说您的应用程序是龙格库塔的一个变体,那么这两个都不可能起作用;您将有不同的t值和建模的状态向量,因此您必须在循环中调用函数,并且这些值不断变化

如果您的算法很慢,那么进行函数调用的效率就无关紧要了。看看优化函数以使其运行更快(或转换为Cython)——实际调用本身并不是瓶颈


编辑:我看到您多次运行此程序,以根据此模拟的随机性确定一系列值。在这种情况下,您应该使用多处理在不同的CPU内核上运行多个模拟-这将加快一些速度。

调用函数只有一种方法。此外,完全不使用函数也会稍微快一点。你能详细说明这个函数的作用吗?你能澄清你的问题吗?在循环中调用函数有一种明显的方法,这是最有效的方法。您是否正在尝试执行一些相关但不同的操作,例如对容器中的每个元素调用函数?为什么要在循环中调用函数?你能详细说明一下你的用例吗?我正在解一个随机微分方程,我有一个函数,其中包含一个算法来解它。因此,我必须在每个时间步调用该函数(类似于Runge Kutta的方法,但使用随机变量),然后我必须多次解方程(因为解是随机的),才能对所有解进行平均。这就是为什么我想知道如何在每次迭代中以最有效的方式调用此函数。根据您的描述,调用行为似乎与性能无关。可能您正在寻找并行性或编译。这是不可能的