gpt4 book ai didi

python - 为什么可变字符串比不可变字符串慢?

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:57 26 4
gpt4 key购买 nike

为什么可变字符串比不可变字符串慢?

编辑:

>>> import UserString
... def test():
... s = UserString.MutableString('Python')
... for i in range(3):
... s[0] = 'a'
...
... if __name__=='__main__':
... from timeit import Timer
... t = Timer("test()", "from __main__ import test")
... print t.timeit()
13.5236170292



>>> import UserString
... def test():
... s = UserString.MutableString('Python')
... s = 'abcd'
... for i in range(3):
... s = 'a' + s[1:]
...
... if __name__=='__main__':
... from timeit import Timer
... t = Timer("test()", "from __main__ import test")
... print t.timeit()
6.24725079536


>>> import UserString
... def test():
... s = UserString.MutableString('Python')
... for i in range(3):
... s = 'a' + s[1:]
...
... if __name__=='__main__':
... from timeit import Timer
... t = Timer("test()", "from __main__ import test")
... print t.timeit()
38.6385951042

我认为很明显为什么我将 s = UserString.MutableString('Python') 放在第二次测试中。

最佳答案

在一种同时提供可变和不可变字符串类型的假设语言中(我实在想不出其中的一种——例如,Python 和 Java 都只有不可变字符串,以及其他通过变异来实现的方法这增加了间接性,因此当然会减慢速度;-),没有任何性能差异的真正原因——例如,在 C++ 中,可互换使用 std::stringconst std::string 我希望不会造成性能差异(诚然,编译器可能能够通过依赖不变性更好地使用后者优化代码,但我不不知道现实世界中有任何确实执行这种理论上可能的优化;-)。

拥有不可变的字符串可能而且确实允许在 Java 和 Python 中进行非常大的优化。例如,如果字符串被散列,散列可以被缓存,并且永远不必重新计算(因为字符串不能改变)——这在 Python 中尤为重要,它使用散列字符串(用于集合中的查找)和词典)如此奢华,甚至“在幕后”。永远不需要“以防万一”之前的副本同时发生变化——只要需要该字符串,就可以始终系统地分发对单个副本的引用。 Python 还大量使用(某些)字符串的“实习”,可能允许进行恒定时间比较和许多其他类似的快速操作——可以将其视为另一种方式,可以肯定是一种更高级的方式,以利用字符串的不变性缓存更多经常对其执行的操作的结果。

当然,这并不是说给定的编译器将利用所有 可能的优化。例如,当请求一个字符串的切片时,实际上没有必要创建一个新对象并将数据复制过来——新切片可能引用具有偏移量(和独立存储的长度)的旧切片,潜在地对从中取出许多切片的大字符串进行了很好的优化。 Python 不会这样做,因为除非在内存管理中特别小心,否则这可能很容易导致“大”字符串全部保存在内存中,而实际上只需要一小部分 - - 但这是一个权衡,不同的实现可能肯定会选择执行( 额外内存管理的负担,可以肯定的是 - 更复杂,更难调试的编译器和运行时代码对于假设的有问题的语言)。

我只是触及表面——如果可变和不可变版本中存在可互换的字符串类型,那么其中许多优点将很难保持(据我目前所知,我怀疑这就是原因至少,C++ 编译器实际上不会为这种优化而烦恼,尽管它们通常非常注重性能)。但是通过提供不可变字符串作为原始的、基本的数据类型(因此在您确实需要可变字符串时隐含地接受了一些缺点;-),Java 和 Python 等语言显然可以获得所有各种优点——性能问题只是其中的一组(例如,Python 选择只允许不可变的原始类型是可散列的,这不是以性能为中心的设计决策——它更多的是关于集合和行为的清晰度和可预测性字典!-)。

关于python - 为什么可变字符串比不可变字符串慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3644576/

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