高效编写 Python 代码
Logan Thomas
Scientific Software Technical Trainer, Enthought
setsset 数据类型及其方法:intersection(): 同时属于两个集合的元素difference(): 属于一个集合但不属于另一个的元素symmetric_difference(): 只属于其中一个集合的元素union(): 属于任一集合的元素in 运算符list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']

list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']
in_common = []
for pokemon_a in list_a:
for pokemon_b in list_b:
if pokemon_a == pokemon_b:
in_common.append(pokemon_a)
print(in_common)
['Squirtle']
list_a = ['Bulbasaur', 'Charmander', 'Squirtle']
list_b = ['Caterpie', 'Pidgey', 'Squirtle']
set_a = set(list_a)
print(set_a)
{'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = set(list_b)
print(set_b)
{'Caterpie', 'Pidgey', 'Squirtle'}
set_a.intersection(set_b)
{'Squirtle'}
%%timeit
in_common = []
for pokemon_a in list_a:
for pokemon_b in list_b:
if pokemon_a == pokemon_b:
in_common.append(pokemon_a)
601 ns ± 17.1 ns 每次循环(7 次运行的平均值 ± 标准差,每次 1000000 次循环)
%timeit in_common = set_a.intersection(set_b)
137 ns ± 3.01 ns 每次循环(7 次运行的平均值 ± 标准差,每次 10000000 次循环)
set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.difference(set_b)
{'Bulbasaur', 'Charmander'}

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_b.difference(set_a)
{'Caterpie', 'Pidgey'}

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.symmetric_difference(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey'}

set_a = {'Bulbasaur', 'Charmander', 'Squirtle'}
set_b = {'Caterpie', 'Pidgey', 'Squirtle'}
set_a.union(set_b)
{'Bulbasaur', 'Caterpie', 'Charmander', 'Pidgey', 'Squirtle'}

# 三种数据结构中均含有相同的 720 个宝可梦
names_list = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set = {'Abomasnow', 'Abra', 'Absol', ...}

# 三种数据结构中均含有相同的 720 个宝可梦
names_list = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set = {'Abomasnow', 'Abra', 'Absol', ...}

names_list = ['Abomasnow', 'Abra', 'Absol', ...]
names_tuple = ('Abomasnow', 'Abra', 'Absol', ...)
names_set = {'Abomasnow', 'Abra', 'Absol', ...}
%timeit 'Zubat' in names_list
7.63 µs ± 211 ns 每次循环(7 次运行的平均值 ± 标准差,每次 100000 次循环)
%timeit 'Zubat' in names_tuple
7.6 µs ± 394 ns 每次循环(7 次运行的平均值 ± 标准差,每次 100000 次循环)
%timeit 'Zubat' in names_set
37.5 ns ± 1.37 ns 每次循环(7 次运行的平均值 ± 标准差,每次 10000000 次循环)
# 720 个宝可梦的一次属性(primary types)
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types = []
for prim_type in primary_types:
if prim_type not in unique_types:
unique_types.append(prim_type)
print(unique_types)
['Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
'Ground', 'Ghost', 'Fighting', 'Flying']
# 720 个宝可梦的一次属性(primary types)
primary_types = ['Grass', 'Psychic', 'Dark', 'Bug', ...]
unique_types_set = set(primary_types)
print(unique_types_set)
{'Grass', 'Psychic', 'Dark', 'Bug', 'Steel', 'Rock', 'Normal',
'Water', 'Dragon', 'Electric', 'Poison', 'Fire', 'Fairy', 'Ice',
'Ground', 'Ghost', 'Fighting', 'Flying'}
高效编写 Python 代码