【发布时间】:2009-10-24 20:19:14
【问题描述】:
我有一个巨大的字符串元组,它们是从程序返回的。返回的示例元组可能如下所示:
('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)')
我可以将这些字符串转换为真正的元组(里面有整数),但我希望有人知道一个很好的技巧来加快这个速度。我想出的任何东西都感觉像是在以一种相对“缓慢”的方式进行。正如我所提到的,这些列表可能很大,因此非常感谢快速方法!
谢谢
编辑一个 好吧,看起来 eval 是一种较慢的方法。但到目前为止,我已经测试了 4 种方法,感谢任何 cmets 和提交! :)
另外,有人问我元组的大小。它的范围从几个到不超过几百万。不是“太大”,但足够大,速度是一个重要因素。我不是来进行微优化的,只是学习任何我可能不知道的新技巧。例如,eval() 是我经常忘记的东西,尽管在这种情况下它似乎做得不太好。
编辑两个 我还想注意字符串格式不应该改变。所以不需要检查格式。此外,这是一个嵌入式 Python v2.6.2,所以 需要 2.6 的任何东西都可以。另一方面,3.0 没那么多;)
看起来很棒的家伙,再次感谢所有输入:)
编辑 3 还有一个注意事项。我注意到我一直在返回没有导致“元组”的代码,这没关系,如果有人认为最终结果“必须”是一个元组,我很抱歉。类似的格式就可以了。
import timeit
test_tuple = ('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)', '(7,0)',)
def timeit_a():
''''''
def convert_tup_strings(tup_string):
first_int, last_int = tup_string[1:-1].split(',')
return (int(first_int), int(last_int))
return map(convert_tup_strings, test_tuple)
def timeit_a_1():
''''''
def convert_tup_strings(tup_string):
return map(int, tup_string[1:-1].split(','))
return map(convert_tup_strings, test_tuple)
def timeit_b():
converted = []
for tup_string in test_tuple:
first_int, last_int = tup_string[1:-1].split(',')
converted.append((int(first_int), int(last_int)))
return converted
def timeit_b_1():
converted = []
for tup_string in test_tuple:
converted.append(map(int, tup_string[1:-1].split(',')))
return converted
def timeit_c():
''''''
return [eval(t) for t in test_tuple]
def timeit_d():
''''''
return map(eval, test_tuple)
def timeit_e():
''''''
return map(lambda a: tuple(map(int, a[1:-1].split(','))), test_tuple)
print 'Timeit timeit_a: %s' % timeit.timeit(timeit_a)
print 'Timeit timeit_a_1: %s' % timeit.timeit(timeit_a_1)
print 'Timeit timeit_b: %s' % timeit.timeit(timeit_b)
print 'Timeit timeit_b_1: %s' % timeit.timeit(timeit_b_1)
print 'Timeit timeit_c: %s' % timeit.timeit(timeit_c)
print 'Timeit timeit_d: %s' % timeit.timeit(timeit_d)
print 'Timeit timeit_e: %s' % timeit.timeit(timeit_e)
结果:
Timeit timeit_a: 15.8954099772
Timeit timeit_a_1: 18.5484214589
Timeit timeit_b: 15.3137666465
Timeit timeit_b_1: 17.8405181116
Timeit timeit_c: 91.9587832802
Timeit timeit_d: 89.8858157489
Timeit timeit_e: 20.1564312947
【问题讨论】:
-
那么,你做了什么,为什么你认为它很慢?
-
我马上就会发布我的测试。我也会用任何其他想法来更新它,但到目前为止我不“知道”我的速度很慢,但我希望可能有一些漂亮的技巧。 Python 经常出人头地,所以我一直在尝试学习新方法:)
-
由于字符串输入元组的长度似乎是一个因素,请将您的 test_tuple 分配行更改为
test_tuple = ('(-1,0)',etc.,etc.)*100。 -
任何时候我看到这种模式:
returnlist = []; for item in sequence: returnlist.append(...something...); return returnlist,就像你在 b1 中看到的那样,你应该考虑改为列表理解。returnlist = [...something... for item in sequence]将更快地构建已解析的元组列表,因为它在 C 代码中进行 for 迭代,而不是在 Python 代码中进行迭代。