Python中split函数的奇怪行为

Python中split函数的奇怪行为,python,performance,Python,Performance,我正在用Python处理大量:分割的数据。我有一个奇怪的情况 这是我同事编写的原始代码: tag = word[i].split(":")[0].decode('utf8') value = int(word[i].split(":")[1]) 我认为这是低效的,因为它调用了split函数两次,一次调用就足够了,所以我将它改为: tokens = word[i].split(":") tag = tokens[0].decode('utf8') value = int(tokens[1])

我正在用Python处理大量:分割的数据。我有一个奇怪的情况

这是我同事编写的原始代码:

tag = word[i].split(":")[0].decode('utf8')
value = int(word[i].split(":")[1])
我认为这是低效的,因为它调用了split函数两次,一次调用就足够了,所以我将它改为:

tokens = word[i].split(":")
tag = tokens[0].decode('utf8')
value = int(tokens[1])
在这之后发生了非常奇怪的事情:

我使用一个日志来记录代码的性能,处理1000行数据大约需要10秒,但修改后处理1000行数据大约需要50秒

为什么会发生这种情况?一个电话不应该比两个电话快吗


感谢您的建议。

日志并不是一种对短代码段进行基准测试的好方法-在您的系统中还发生了许多其他事情。使用timeit模块将获得更准确的结果:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> word = ["answer:42"]
>>> def split1(word=word):
...     tag = word[0].split(":")[0].decode("utf-8")
...     value = int(word[0].split(":")[1])
... 
>>> def split2(word=word):
...     tokens = word[0].split(":") 
...     tag = tokens[0].decode("utf-8")
...     value = int(tokens[1])
... 
>>> t2 = timeit.Timer("split2()", "from __main__ import split2")
>>> t2.timeit()
2.5862038135528564
>>> t1 = timeit.Timer("split1()", "from __main__ import split1")
>>> t1.timeit()
2.8647868633270264

日志并不是一种对短代码段进行基准测试的好方法——在您的系统中还有很多其他的事情发生。使用timeit模块将获得更准确的结果:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> word = ["answer:42"]
>>> def split1(word=word):
...     tag = word[0].split(":")[0].decode("utf-8")
...     value = int(word[0].split(":")[1])
... 
>>> def split2(word=word):
...     tokens = word[0].split(":") 
...     tag = tokens[0].decode("utf-8")
...     value = int(tokens[1])
... 
>>> t2 = timeit.Timer("split2()", "from __main__ import split2")
>>> t2.timeit()
2.5862038135528564
>>> t1 = timeit.Timer("split1()", "from __main__ import split1")
>>> t1.timeit()
2.8647868633270264

您可能希望显示已显示的片段周围的代码。10秒听起来太慢了,无法处理1000件事情,更不用说50秒了。我打赌性能影响在别处,而不是这里。嗯,好奇。。。拆分时是否有2个以上的条目。。。否则,可能是将这些条目额外分配给令牌。。。只是一个猜测…@JoshSmeaton它涉及在每行中查询Redis几次,每行由几十个:分隔的单词组成。单独测试或根本不测试。更可能的情况是流中的其他地方发生了更改,例如转到Redis并返回的时间或诸如此类的时间。如果始终只有1':',则使用单词[i]会更有效。分区:您可能希望显示已显示的片段周围的代码。10秒听起来太慢了,无法处理1000件事情,更不用说50秒了。我打赌性能影响在别处,而不是这里。嗯,好奇。。。拆分时是否有2个以上的条目。。。否则,可能是将这些条目额外分配给令牌。。。只是一个猜测…@JoshSmeaton它涉及在每行中查询Redis几次,每行由几十个:分隔的单词组成。单独测试或根本不测试。更可能的情况是流中的其他地方发生了更改,例如转到Redis并返回的时间或类似的时间。如果总是正好有1':',则使用单词[i]会更有效。分区: