Tim*_*der 3 python memory string loops python-3.3
据我所知,".join(iterable_of_strings)是连接字符串的首选方法,因为它允许优化,避免必须将不可变对象重写到内存的次数超过必要时间.
在表达式中添加字符串可靠地运行得比为它进行适度大量操作而加入它们更快.
我在加入时获得了大约2.9-3.2秒的时间,并且在我的笔记本电脑上使用Python 3.3添加了运行此代码的2.3-2.7.谷歌搜索这个我找不到一个好的答案.有人可以解释可能发生的事情或指导我找到一个好的资源吗?
import uuid
import time
class mock:
def __init__(self):
self.name = "foo"
self.address = "address"
self.age = "age"
self.primarykey = uuid.uuid4()
data_list = [mock() for x in range(2000000)]
def added():
my_dict_list = {}
t = time.time()
new_dict = { item.primarykey: item.name + item.address + item.age for item in data_list }
print(time.time() - t)
def joined():
my_dict_list = {}
t = time.time()
new_dict = { item.primarykey: ''.join([item.name, item.address, item.age]) for item in data_list }
print(time.time() - t)
joined()
added()
Run Code Online (Sandbox Code Playgroud)
据我所知,".join(iterable_of_strings)是连接字符串的首选方法,因为它允许优化,避免必须将不可变对象重写到内存的次数超过必要时间.
你理解有些不正确."".join(iterable_of_strings)是你解释的原因,是连接可迭代字符串的首选方法.
但是,您没有可迭代的字符串.你只有三个字符串.连接三个字符串的最快方法是将它们一起添加+或使用.format()或%.这是因为在你的情况下你必须首先创建iterable,然后加入字符串,所有这些都是为了避免复制一些非常小的字符串.
.join()在你拥有如此多的字符串之前不会变得更快,这使得愚蠢的代码无论如何都会使用其他方法.当发生这种情况取决于你的Python实现,版本和字符串的长度,但我们通常谈论的是十多个字符串.
虽然并非所有实现都具有快速连接,但我已经测试了CPython,PyPy和Jython,并且所有这些都只有几个字符串更快或更快地连接.
从本质上讲,您应该在代码运行之前使用+并.join()根据代码清晰度进行选择.然后,如果您关心速度:配置文件并对您的代码进行基准测试.不要坐着猜.
一些时间:http://slides.colliberty.com/DjangoConEU-2013/#/step-40
有视频说明:http://youtu.be/50OIO9ONmks?t = 18m30s