本问题已经有最佳答案,请猛点这里访问。

所以我一直在看到人们写代码,当他们希望看到给定值的平方形式时,他们会写出x * x而不是x ** 2。 这两个点之间是否存在很大的效率重叠,是不是仅使用了python中的给定函数,还是仅仅是一个风格上的点? 我宁愿使用**运算符,但是如果它会引起极大的失误,我是否应该执行该操作十亿次,我知道的太多了,我有点想知道。 同样,如果我在数量上误认为一个可以接管另一个,那么我也想对此进行更正。 即,如果**比x * x更有效,那么我也想知道为什么。

我猜人们使用x*x而不是x**2,因为它在所有语言中均有效,而x**2在Java / C / C ++中则无效。 所以我想大多数例子的原因都是无知。 我很想知道是否存在效率差异/数值差异。

我不同意g.d.d.c,乘法要快得多!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30"""Evaluating the difference in execution time between n*n and n**2"""

from time import time

n = 2

t = time()

for i in range(5000000):

n**2

print("Time for n**2:\t%0.3f" % (time()-t))

t = time()

for i in range(5000000):

n*n

print("Time for n*n:\t%0.3f" % (time()-t))

def test(n):

"""

Difference in execution time between n*n and n**2

within function scope.

"""

t = time()

for i in range(5000000):

n**2

print("Time for n**2:\t%0.3f" % (time()-t))

t = time()

for i in range(5000000):

n*n

print("Time for n*n:\t%0.3f" % (time()-t))

test(n)

结果:

1

2

3

4Time for n**2: 2.324496030807495

Time for n*n: 0.5879969596862793

Time for n**2: 2.0771241188049316

Time for n*n: 0.2894318103790283

您可以看到,函数外的乘法运算速度大约快4倍,而函数外的运算速度快7倍。 我无法解释这两个测试之间的区别,也不确定n * n和n ** 2之间的区别,但这可能与Python是一种解释型语言有关,而后者的处理则需要花费一定的时间。 如gddc所示,即使处理器操作非常相似,也需要更多时间。

如果它在一个函数中或在一个函数之外,为什么会有所不同(如此巨大!)?

@moose:最有可能是因为全局变量查找是字典查找,而局部变量查找正在索引数组。

现在我有点困惑了,我发现实际上它确实考虑到了巨大的速度差异,这代表了我的初衷。我不认为这会有很大的不同,也不会导致在函数范围之内或之外。有时候这种奇怪的语言。

@ user2357112你说的很有趣,请您进一步解释一下?我虽然locals()返回了dict以及globals()…

同样,看起来您在Python 3上计时了,而另一个人在Python 2上计时。在这种情况下,Python 3s的bignum指数运算比Python 2s的指数运算差很多。在Python 2上,n**2和n*n的计时几乎相同,如其他答案所示。

@Labo:locals()返回一个dict,但是Python实际上并不将该dict用于局部变量查找。这就是文档说不修改字典的原因之一;它不会影响局部变量的值。

顺便说一句,您使用的是哪个Python 3版本?我对ideone(Python 3是Python 3.4)的测试表明,与乘法相比,幂运算性能有了显着提高。

Python 3.4.3,但3或4几乎相同…

+1代表代码;但您还应该进行切换实验:只需切换n*n和n**2的代码块。特别是对于"全局实验",您会注意到这有所作为。

实际上,两者的总成本可能非常相似:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21>>> def s1(x):

... return x * x

...

>>>

>>> def s2(x):

... return x ** 2

...

>>>

>>> from dis import dis

>>>

>>> dis(s1)

2 0 LOAD_FAST 0 (x)

3 LOAD_FAST 0 (x)

6 BINARY_MULTIPLY

7 RETURN_VALUE

>>> dis(s2)

2 0 LOAD_FAST 0 (x)

3 LOAD_CONST 1 (2)

6 BINARY_POWER

7 RETURN_VALUE

>>>

我认为您可能过早地进行了优化,即使对于数百万或数十亿次的迭代也是如此。 除非您已将此视为瓶颈,否则请使用最适合您的用法。

并且,为完整起见,timeit结果:

1

2

3

4>>> timeit.Timer("s1(10)", 'from __main__ import s1').timeit(100000)

0.0186597650628606

>>> timeit.Timer("s2(10)", 'from __main__ import s2').timeit(100000)

0.018789616358585448

这似乎表明x * x在100000次迭代中的速度如此之快。

因此,它本身只是一个样式概念。我一直以为这只是c语言中pow()函数的一部分,因为它进行了函数调用,所以我看到了使用该语言的需要,但是在python中,因为它是内置的。我只是不明白为什么不使用它它。在我看来,只要操作员是已知和理解的,它比其他方法更具表达力。谢谢您的帮助。

对于10e6,它就是那个值,但是它的时间复杂度会成倍增长还是持续增长?我知道在宏伟的计划中,这没什么大不了的,但要做Project Euler Problems,自学Python语言,甚至四分之一秒的时间也让我有些困惑。

没事求幂比常规CPU上的乘法慢得多。您的基准测试没有显示这一点,因为时间是由函数调用(我猜测)或其他动态Python恶作剧的成本所决定的。在编译语言中,差异是巨大的。即使在Python中,我也可以想象在没有函数调用的情况下,它在紧密循环中也有很大的不同,但我没有进行基准测试。无论如何,这(很不幸)与许多应用程序的过早优化相去甚远。

@KonradRudolph:它不是CPU的东西; Python int指数运算不会调用任何CPU指数指令。其所有软件。在Python 2中,即使剥离了函数调用,由于所有其他开销,两者之间的差异约为6%。在Python 3中,相差约为3倍,因为bignum指数代码也无法处理问题。

@ user2357112我看不出这会使事情变得更好。与乘法相比,在软件中实现幂运算会使速度变慢。您的基准测试不足以显示这种差异,因为操作太快,并且计时器的精度相对太低。

python2的n次方代码_关于python:*与**的2次幂运算相关推荐

  1. python2发送http不编码_[转]Python 2.x中常见字符编码和解码方面的错误及其解决办法...

    Python 2.x中的字符编码,设计的的确不好,导致初学者,甚至是即使用Python很长时间的人,都会经常遇到字符编解码方面的错误. 下面就把一些常见情,尽量的都整理出来,并给出相应的解决办法. 看 ...

  2. python画pr曲线代码_利用Python中的numpy包实现PR曲线和ROC曲线的计算

    闲来无事,边理解PR曲线和ROC曲线,边写了一下计算两个指标的代码.在 python 环境下,sklearn里有现成的函数计算ROC曲线坐标点,这里为了深入理解这两个指标,写代码的时候只用到numpy ...

  3. python三维重建代码_基于Python的三维重建开源代码

    [实例简介] 基于Python的三维重建开源代码,包括特征提取,SFM,PMVS以及CMVS等相关功能! [实例截图] [核心代码] sfm-bundler(python) └── sfm-bundl ...

  4. python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

    原标题:一行Python代码能做出哪些神器的事情 (1)一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http. ...

  5. python全球购代码_理解python的unicode字符串

    基于python2.7中的字符串: unicode-->编码encode('utf-8')-->写入文件 读出文件-->解码decode('utf-8')-->unicode ...

  6. python母亲节快乐代码_用 Python 送上特殊的母亲节祝福

    今天是母亲节,做儿女的自然要为母亲送上节日的祝福,如果自己在母亲身边的话,可以直接说几句祝福的话以及送一些小礼物什么的,要是不在母亲身边的话,可以打个电话问候一下. 当然了,作为一个程序员,除了上面的 ...

  7. python下载图片代码_使用Python下载Bing图片(代码)

    直接上代码: # -*- coding: cp936 -*- import urllib import os print 'Download data......' url = 'http://cn. ...

  8. python装b代码_一行python代码带你装B

    一行代码,python就能让你玩出花来.今天给大家介绍几个有趣的一行代码. 1.心形字符,全中文的话可能会变形,大家可以试试中英文搭配. print('\n'.join([''.join([('Ilo ...

  9. python微信自动回复代码_使用python实现微信自动回复功能

    有时忙着时候,我们可以设置微信自动回复,这样又不会无视别人信息,又能节省时间,具体怎么实现呢?本文实例为大家分享了python实现微信自动回复的具体代码,供大家参考. 具体内容如下 预装: pytho ...

最新文章

  1. 如何定制一款12306抢票浏览器——构架
  2. 我国大陆居民身份证Java验证
  3. 安全体系结构与七个设计原则
  4. 【蓝桥杯-第五届】 啤酒和饮料
  5. 【NLP】预训练模型综述
  6. SGML、HTML和XML之间的关系
  7. finally块不被执行的情况总结
  8. 大数据怎样帮助运维工程师实现无死角监控?
  9. MySQL_DBA整理
  10. php网页背景音乐代码,HTML5背景音乐播放器代码
  11. vivo7.0系统怎么无root激活XPOSED框架的教程
  12. 【数字图像处理】霍夫(Hough)变换
  13. 计算机标准用户英文名称,标准计算机专业英文简历范文
  14. 北京科技大学计算机考研
  15. 每周跑一下Python脚本,轻松生成工作日志模板
  16. 高薪程序员面试题精讲系列89之MySQL有哪些索引?
  17. chinacache解决方案——静态内容加速
  18. 概率论 | 联合熵、条件熵、互信息之间的表示、关系及大小
  19. 201421410039鹿永润实验二第一部分
  20. 2017百度之星 复赛

热门文章

  1. mysql要求cpu主频还是核数_CPU主频和核数哪个重要?买CPU是选多核还是高主频? (全文)...
  2. 算法 PK 猫咪 | 章鱼保罗后继竟然是只猫?
  3. pycharm使用超级鹰无输出结果/尝试新的跨平台问题
  4. 如何找到电影的下载链接
  5. 烹饪专业的计算机课程,烹饪专业培养目标、课程设置及教学计划
  6. 黑马程序员C++第一章
  7. chrome插件推荐(第一期)
  8. Problem M: 定义类Shape、Rectangle、Circle和Square
  9. Oracle体系结构篇之数据文件
  10. onvif工具使用简介