如何将dict(zip(range(n),range(n)))翻译成Python 3?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何将dict(zip(range(n),range(n)))翻译成Python 3?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1997字,纯文字阅读大概需要3分钟。
内容图文
我刚刚在代码上运行了2to3(A):
def idict(n):
return dict(zip(range(n), range(n)))
它产生了这个(B):
def idict(n):
return dict(list(zip(list(range(n)), list(range(n)))))
dict和zip都可以使用迭代器,为什么这个翻译呢?
B似乎也很慢.测试用
python -m timeit -s "import B as t" "t.idict(10)"
结果如下:
________________A______B______C___
Python 2.7.13 2.89 3.82 2.29
Python 3.5.1 2.63 4.34 A
即.从2.89 usec到4.34(50%)的默认翻译.
问题..(i)有没有理由不在Python 3中使用原始代码? (它产生了正确的结果,对我来说似乎是合理的); (ii)是2to3正确的工具(我们需要在转换~150KLOC的python时在2和3上运行)
更新:我在表中添加了dict(itertools.izip(xrange(n),xrange(n)))作为算法C.
解决方法:
py2to3没有看到全局图片.它只是创建了一些等效的代码,通过添加列表包装来替换现在不再创建列表的函数,以确保:
>一个人可以下标结果
>可以根据需要多次迭代结果
(它还在括号周围加上括号,……但这里不相关)
所以它试图让你的代码运行,但性能并不像所有人那样保证.
在您的示例中,列表包装器是无用的,因为dict使用迭代器.
因此,此工具可以使代码快速运行,但不应在不与原始代码进行比较的情况下使用,并决定要保留什么/要更改的内容.
该工具可能会改进为:
>在循环中使用迭代器时避免换行
>当迭代器传递给一个以迭代为输入的对象时,避免包装.
在你的情况下
dict(zip(range(n), range(n)))
完全没问题,并且在python 3中比在python 2中运行得更快,因为它避免了中间列表创建,所以保持这种方式.
一个python 2相当于它会稍微复杂一点:
dict(itertools.izip(xrange(n), xrange(n)))
如果你有很多代码需要翻译我的建议(我去过那里):
>使用python 3开关和python 2解释器来暴露你的代码并得到一些警告,而不是让它在python 3中崩溃(好吧,它应该警告Python 3x不兼容,2to3不能轻易修复,但它错过了一个很多情况,好吧,它总比没有好,例如它找到臭名昭着的has_key调用)
>使用py2to3并将结果与??原始代码进行比较,手动决定应用更改的位置
>你也可以使用像GrepWin这样的工具进行多搜索/替换来做py2to3会做的事情,只是降低性能的风险较小:
>搜索iteritems,替换项目
>搜索xrange,替换范围
>追踪dict.has_key调用,内置unicode
>我可能会忘记一些……
>使用python 3广泛地测试和公开你的代码.有些东西对于工具和-3选项是不可见的,就像你使用二进制模式来读取文本文件一样.
内容总结
以上是互联网集市为您收集整理的如何将dict(zip(range(n),range(n)))翻译成Python 3?全部内容,希望文章能够帮你解决如何将dict(zip(range(n),range(n)))翻译成Python 3?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。