gpt4 book ai didi

python - 优化Python函数调用的性能

转载 作者:行者123 更新时间:2023-11-30 23:33:32 25 4
gpt4 key购买 nike

我有以下示例代码,它类似于我正在处理的主要代码。我看到的主要瓶颈是函数调用 call_fun。有没有办法加快速度? ..示例:不使用字典对象 self._d 而是使用其他内容进行函数查找?在主代码中,“名称”列表相当大。您可以启用注释掉的打印语句以快速理解代码(.​​..但如果您想打印输出,请务必将 i in range(500000) 更改为 i in range(1) )

import time

names = [ ('f_a', ([1,1],)), ('f_b', ([3,4],) ) ]

class A(object):
def __init__(self):
self._d = {}
for n in names:
self._d[n[0]] = getattr(self, n[0])

def call_fun(self, k):
#print " In call_fun: k: ", k
return self._d[k[0]](*k[1])

def f_a(self, vals):
#print " I am here in f_a.. vals=", vals
v = 2*vals
return v

def f_b(self, vals):
v = 3*vals
return v


# Run the code

start = time.clock()
a = A()
print "names[0]:", names[0]
for i in range(5000000):
a.call_fun((names[0]))
print "done, elapsed wall clock time (win32) in seconds: " , time.clock() - start

以下是分析输出:python -m cProfile --sortcumulative foo.py

    10000009 function calls in 5.614 seconds

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function)
1 2.066 2.066 5.614 5.614 foo.py:1(<module>)
5000000 2.345 0.000 3.412 0.000 foo.py:11(call_fun)
5000000 1.067 0.000 1.067 0.000 foo.py:15(f_a)
1 0.135 0.135 0.135 0.135 {range}
1 0.000 0.000 0.000 0.000 foo.py:6(__init__)
2 0.000 0.000 0.000 0.000 {time.clock}
1 0.000 0.000 0.000 0.000 foo.py:5(A)
2 0.000 0.000 0.000 0.000 {getattr}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

最佳答案

我认为没有太大的改进空间。毕竟,您将在大约 5 秒内执行 500 万次函数调用,即每个函数调用需要 1μs(不是 1ns)或在 2 GHz CPU 上大约 2000 个 CPU 周期。

你最好的选择可能是 PyPy如果您可以忍受它的局限性。

$ python -V
Python 2.7.1
$ python so18736473.py
names[0]: ('f_a', ([1, 1],))
done, elapsed wall clock time (win32) in seconds: 5.418259
$ pypy -V
Python 2.7.2 (341e1e3821fff77db3bb5cdb7a4851626298c44e, Jun 09 2012, 14:24:11)
[PyPy 1.9.0]
$ pypy so18736473.py
names[0]: ('f_a', ([1, 1],))
done, elapsed wall clock time (win32) in seconds: 0.648846

关于python - 优化Python函数调用的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18736473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com