加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python if else微优化

发布时间:2020-12-20 13:05:35 所属栏目:Python 来源:网络整理
导读:在思考代码的优化时,我想知道哪些在 python中更贵: if x: d = 1else: d = 2 要么 d = 2if x: d = 1 有什么想法吗?我喜欢第二次减少的行数,但想知道重新分配是否比条件切换更昂贵. 解决方法 不要思考,不要怀疑,测量 – 使用shell命令行的timeit(到目前为止
在思考代码的优化时,我想知道哪些在 python中更贵:

if x:
    d = 1
else:
    d = 2

要么

d = 2
if x:
    d = 1

有什么想法吗?我喜欢第二次减少的行数,但想知道重新分配是否比条件切换更昂贵.

解决方法

不要思考,不要怀疑,测量 – 使用shell命令行的timeit(到目前为止最好,最简单的方式使用它!).在笔记本电脑上的Mac OSX 10.5上的Python 2.5.4 …:

$python -mtimeit -s'x=0' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0748 usec per loop
$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0685 usec per loop
$python -mtimeit -s'x=0' 'd=2' 'if x: d=1'
10000000 loops,best of 3: 0.0734 usec per loop
$python -mtimeit -s'x=1' 'd=2' 'if x: d=1'
10000000 loops,best of 3: 0.101 usec per loop

所以你看:当x为假时,“just-if”形式可以节省1.4纳秒,但是当x为真时,与“if / else”形式相比,成本为40.2纳秒;因此,在微优化环境中,只有当x的误差可能比真实或其他地方低30倍时,才应使用前者.也:

$python -mtimeit -s'x=0' 'd=1 if x else 2'
10000000 loops,best of 3: 0.0736 usec per loop
$python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops,best of 3: 0.076 usec per loop

… if / else的三元运算符有其自己的微小优缺点.

当差异如此微小时,你应该重复测量,确定噪声水平是什么,并确保你没有把“噪音”中的差异视为重要.例如,要在“x为真”的情况下比较语句与表达式if / else,请重复几次:

$python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops,best of 3: 0.076 usec per loop
$python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops,best of 3: 0.0749 usec per loop
$python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops,best of 3: 0.0742 usec per loop
$python -mtimeit -s'x=1' 'd=1 if x else 2'
10000000 loops,best of 3: 0.0745 usec per loop

现在你可以说表达式表达式(在这台机器和关键软件的版本上)74.2到76.0纳秒 – 范围比任何单个数字更具表现力.同样地:

$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0688 usec per loop
$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0681 usec per loop
$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0687 usec per loop
$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0679 usec per loop
$python -mtimeit -s'x=1' 'if x: d=1' 'else: d=2'
10000000 loops,best of 3: 0.0692 usec per loop

现在你可以自信地说明声明表格(在相同的条件下)需要67.9到69.2纳秒;所以它的优势,对于x true,表达形式,是4.8到8.1纳秒(将后一个区间估计限制在6.3到6.8纳秒是相当公平的,比较最小/最小和最大/最大而不是最小/最大和最大/最小,更谨慎的估计确实).

一旦你意识到任何特定的护理它们是微观的,那么多少时间和精力值得投入这种微观差异,当然,这是一个不同的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读