长方程还是分解方程Python中什么更快?
假设我有以下代码:长方程还是分解方程Python中什么更快?,python,optimization,equation,Python,Optimization,Equation,假设我有以下代码: qwe = 1.5 def jkl(l): result = 2*(math.pi/l) return result def asd(b, l): result = (abs(((jkl(l)**2)*(qwe**2))-(b**2))**(0.5) return result 现在,在asd def中有这么长的方程式是否更有效,或者如果它被分解,计算速度会更快: def asd(b, l): z1=jkl(l)**2
qwe = 1.5
def jkl(l):
result = 2*(math.pi/l)
return result
def asd(b, l):
result = (abs(((jkl(l)**2)*(qwe**2))-(b**2))**(0.5)
return result
现在,在asd def中有这么长的方程式是否更有效,或者如果它被分解,计算速度会更快:
def asd(b, l):
z1=jkl(l)**2
z2=qwe**2
z3=b**2
z4=(z1*z2)-z3
z5=abs(z4)
z6=z5**(0.5)
return z6
由于我的代码可能会被第三方使用和修改,这个分解的示例很容易理解,但是创建所有函数变量比在一行中完成更慢吗?它需要尽可能快,因为该函数将被其他更复杂的函数调用数百次 没有测量就无法判断。幸运的是,Python附带了一个能做到这一点的工具 只需通过timeit.timeit运行这两个函数,它就会告诉您哪一个更快 我的直觉是紧凑的单线形式更快,但我可能错了 您可能需要将2*math.pi替换为常数PI2: 由于函数调用代价高昂,您应该将此代码内联到asd中
PS:我希望实际代码中的函数名更具可读性:当我在某人的代码中看到自闭症时,我感到一阵强烈的愤怒- 没有测量就无法判断。幸运的是,Python附带了一个能做到这一点的工具 只需通过timeit.timeit运行这两个函数,它就会告诉您哪一个更快 我的直觉是紧凑的单线形式更快,但我可能错了 您可能需要将2*math.pi替换为常数PI2: 由于函数调用代价高昂,您应该将此代码内联到asd中
PS:我希望实际代码中的函数名更具可读性:当我在某人的代码中看到自闭症时,我感到一阵强烈的愤怒- 许多人建议使用python的timeit模块来测试速度:
print timeit.timeit('asd(2,2)','from __main__ import asd')
print timeit.timeit('asd_split(2,2)','from __main__ import asd_split')
>>>0.93675494194
>>>1.0719628334
正如预期的那样,非拆分版本似乎更快。正如许多人建议使用python的timeit模块来测试速度:
print timeit.timeit('asd(2,2)','from __main__ import asd')
print timeit.timeit('asd_split(2,2)','from __main__ import asd_split')
>>>0.93675494194
>>>1.0719628334
正如预期的那样,非拆分版本似乎更快。使用测试代码段的python性能。如果有任何差异,则差异较小,并且取决于解释器是否可以在一个大语句中找到优化,而在单独的语句中找不到优化。。。如果您有大量的这些复杂计算,您是否考虑过使用numpy?…并使用来更好地了解代码中发生了什么。@JonClements:任何性能差异都将取决于局部变量的赋值。请随意将两个版本的计时结果作为答案发布:附带说明:这些不是方程。而是在函数中计算的表达式。使用测试代码段的python性能。如果有任何差异,则差异较小,并基于解释器是否可以在一个大语句中找到优化,而在单独的语句中找不到优化。。。如果您有大量的这些复杂计算,您是否考虑过使用numpy?…并使用来更好地了解代码中发生了什么。@JonClements:任何性能差异都将取决于局部变量的赋值。请随意将两个版本的计时结果作为答案发布:附带说明:这些不是方程。相反,在function.asd中计算的表达式可以是平均标准偏差:asd只是用来简化它。我使用了timeit,虽然我不太确定差异有多大,但还是有差异的。1行ask给出1.15374980281118132,而细分ask给出1.2557689225396658。用常数替换math.pi后,我得到1.1223440587650901。非常感谢,这将有望提高我的代码速度:asd可能是平均标准偏差asd只是用来简化它。我使用了timeit,虽然我不太确定差异有多大,但还是有差异的。1行ask给出1.15374980281118132,而细分ask给出1.2557689225396658。用常数替换math.pi后,我得到1.1223440587650901。非常感谢,这将有望提高我的代码速度:谢谢,尽管我刚刚运行了定义文件definitions.py,然后在shell中输入了t=timeit.Timer'definations.asd8,0.6','import definations',然后是t.timeit,没有下划线也能正常工作:谢谢,虽然我只是运行了我的定义文件definitions.py,然后在shell中放置了t=timeit.Timer'definations.asd8,0.6','import definations',然后是t.timeit,它似乎在没有下划线的情况下也能正常工作: