Skip to main content
 首页 » 编程设计

python之将 '(-1,0)' 转换为元组 (-1, 0) 的最快方法

2025年05月04日8softidea

我有一个巨大的字符串元组,它们是从程序返回的。返回的示例元组可能如下所示:

('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)') 

我可以将这些字符串转换成真正的元组(里面有整数),但我希望有人知道一个很好的技巧来加快这个过程。我想出的任何事情都感觉我正在以一种相对“缓慢”的方式进行。正如我所提到的,这些列表可能很大,因此非常感谢快速的方法!

谢谢

编辑一个 好吧,看来 eval 是一种较慢的方法。但到目前为止,我已经测试了 4 种方法,感谢您的任何评论和提交! :)

另外,有人问我元组的大小。它的范围从几个到希望不超过几百万不等。不是“太大”,但足够大,速度是一个重要因素。我不是来这里进行微优化的,只是学习我可能不知道的任何新的漂亮技巧。例如,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 

请您参考如下方法:

我根本不建议您使用 eval。它缓慢且不安全。你可以这样做:

result = map(lambda a: tuple(map(int, a[1:-1].split(','))), s) 

数字不言自明:

timeit.Timer("map(lambda a: tuple(map(int, a[1:-1].split(','))), s)", "s = ('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)')").timeit(100000) 
 
1.8787779808044434 
 
timeit.Timer("map(eval, s)", "s = ('(-1,0)', '(1,0)', '(2,0)', '(3,0)', '(4,0)', '(5,0)', '(6,0)')").timeit(100000) 
 
11.571426868438721