gpt4 book ai didi

python - 如何将 dict(zip(range(n), range(n))) 翻译成 Python 3?

转载 作者:太空狗 更新时间:2023-10-30 02:53:08 26 4
gpt4 key购买 nike

我刚刚在看起来像这样 (A) 的代码上运行了 2to3:

def idict(n):
return dict(zip(range(n), range(n)))

它生成了这个 (B):

def idict(n):
return dict(list(zip(list(range(n)), list(range(n)))))

dictzip 都可以使用迭代器,那么为什么要这样翻译呢?

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 看不到全局图片。它只是创建一些等效代码,通过添加 list 包装器替换现在不再创建列表的函数,以确保:

  • 可以对结果进行下标
  • 可以根据需要多次迭代结果

(它还在 print 两边加上括号,...但这里不相关)

因此它会尝试让您的代码运行,但性能根本无法保证

在您的示例中,列表包装器是无用的,因为 dict 使用迭代器。

因此,此工具对于使代码快速运行很有用,但如果不与原始代码进行比较并决定保留/更改什么,则不应使用。

该工具可能会改进为:

  • 避免在循环中使用迭代器时换行
  • 避免在将迭代器传递给以可迭代对象作为输入的对象时进行换行。

在你的情况下

dict(zip(range(n), range(n)))

非常好并且在 python 3 中比在 python 2 中运行得更快,因为它避免了中间列表的创建,所以就这样吧。

与之等效的 python 2 会稍微复杂一些:

dict(itertools.izip(xrange(n), xrange(n)))

如果您有很多代码需要翻译(我去过那里),我的建议是:

  • 在 python 2 解释器中使用 python -3 开关来公开您的代码并获得一些警告,而不是让它在 python 3 中崩溃(好吧,它应该警告 Python 3.x 不兼容2to3 不能轻易修复,但它遗漏了很多情况,好吧,总比没有好,例如它发现臭名昭著的 has_key 调用)
  • 使用 py2to3 并将结果与​​您的原始代码比较手动决定在哪里应用更改
  • 您还可以使用 GrepWin 等工具进行多重搜索/替换来执行 py2to3 可以执行的操作,而且降低性能的风险较小:
    • 搜索iteritems,替换为items
    • 搜索xrange,替换为range
    • 跟踪 dict.has_key 调用,unicode 内置
    • 我可能会忘记一些...
  • 使用 python 3 广泛测试和公开您的代码。工具和 -3 选项不可见某些内容,例如当您使用二进制模式读取时文本文件等。

关于python - 如何将 dict(zip(range(n), range(n))) 翻译成 Python 3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50767506/

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