python性能 - 元组列表或关系字典?

时间:2012-12-04 16:59:49

标签: python performance list dictionary tuples

我想定义一个简单的替换字典,它将被迭代以清理字符串。例如,要清理地址,这是更好的练习(性能,风格等)?

A)

dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key in dictionary:
    address = address.replace(key, dictionary[key])

或b)

tuple_list = [('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]
address = 'North South East West'
for tuple in tuple_list:
    address = address.replace(tuple[0], tuple[1])

谢谢!

3 个答案:

答案 0 :(得分:3)

两者之间没有太大的速度差异;您正在迭代两个序列,并且只有这些结构的确切数据类型不同。

使用dictionary方法,您的.iteritems()循环效率会更高一些:

dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key, value in dictionary.iteritems():
    address = address.replace(key, value)

由于.iteritems()为您提供了(key, value)对的迭代,因此此方法与使用元组完全相同。

使用timeit module,您可以看到两种方法之间没有真正的区别:

>>> import timeit
>>> def dictionary(address, d={'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}):
...     for s, repl in d.iteritems():
...         address = address.replace(s, repl)
... 
>>> def tuples(address, t=[('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]):
...     for s, repl in t:
...         address = address.replace(s, repl)
... 
>>> timeit.timeit("test('North South East West')", 'from __main__ import dictionary as test')
2.5873939990997314
>>> timeit.timeit("test('North South East West')", 'from __main__ import tuples as test')
2.5879111289978027

答案 1 :(得分:1)

如果只是迭代它,你会使用一个列表。

要查找密钥,请使用dict。

首先不一定要慢,只是它不是dict的用途。

如果使用dict,按键查找将比使用dict要快得多(因此尝试线性查找元素),因此如果要将该集合用于此目的,请使用一个。否则不要。

在你的情况下,你没有在你的字典中找到“North”“South”“East”和“West”,你正在进行反向 - 在你的“地址”字符串中找到它们。

您最快的算法可能是对您的地址字符串进行标记(拆分),遍历每个元素并在dict中查找是否应该替换它,然后重新加入。

它不仅会更有效率,而且会避免克服替换,除非你当然想要那些。

答案 2 :(得分:0)

%%timeit
dictionary = {'North': 'N', 'South': 'S', 'East': 'E', 'West': 'W'}
address = 'North South East West'
for key in dictionary:
    address = address.replace(key, dictionary[key])
1000000 loops, best of 3: 1.84 us per loop

%%timeit
tuple_list = [('North', 'N'), ('South', 'S'), ('East', 'E'), ('West', 'W')]
address = 'North South East West'
for tuple in tuple_list:
    address = address.replace(tuple[0], tuple[1])
100000 loops, best of 3: 1.9 us per loop

就像Martijn所说,实际上没有区别。