Skip to main content

列表推导执行效率更高

join的运行效率比"+"

两者就像一个 o(n)o(1) 的关系

由于字符串是不可变对象,当使用“+”连接字符串的时候,每执行一次“+”操作都会申请一块新的内存,然后复制上一个“+”操作的结果和本次操作的有操作符到这块内存空间中,所以用“+”连接字符串的时候会涉及内存申请复制

join在连接字符串的时候,首先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去。在用"+"连接字符串时,结果会生成新的对象,而用join时只是将原列表中的元素拼接起来,因此在连接字符串数组的时候会考虑优先使用join。

# 创建将0到19连接起来的字符串 (例 "012..1819")
nums = ""
for n in range(20):
nums += str(n) # 慢且低效
print nums

# 创建将0到19连接起来的字符串 (例 "012..1819")
nums = []
for n in range(20):
nums.append(str(n))
print "".join(nums) # 更高效

# 创建将0到19连接起来的字符串 (例 "012..1819")
nums = [str(n) for n in range(20)]
print "".join(nums)
  • 最优做法
# 创建将0到19连接起来的字符串 (例 "012..1819")
nums = map(str, range(20))
print "".join(nums)

将大数据转换为set来搜索更高效

即使两个函数看起来完全一样,但因为 查找集合 是利用了Python中的集合是可哈希的特性,两者的查询性能是非常不同的。为了判断一个项是否在列表中,Python将会查看每个项直到它找到匹配的项。这是耗时的,尤其是对长列表而言。另一方面,在集合中,项的哈希值将会告诉Python在集合的哪里去查找匹配的项。结果是,即使集合很大,查询的速度也很快。

s = set(['s', 'p', 'a', 'm'])
l = ['s', 'p', 'a', 'm']

def lookup_set(s):
return 's' in s

def lookup_list(l):
return 's' in l

使用 in 来查找字符串

对比案例

# 定义数据
test = ["asdfasfAAASASFADSF-*/-/-*/zx-cvzxcvadsf-a*df/"] * 5000

# 使用 find 来判断
def t1(tar: str):
if tar.find("*df") > -1:
tmp = 9 * 9
return tmp

# 使用 in 来判断
def t2(tar: str):
if "*df" in tar:
tmp = 9 * 9
return tmp

定义了一个有5000个元素的测试数据列表,都是字符串,分别查找10000次进行对比

import time

start = time.time()
for each in range(10000):
for e in test:
t1(e)
end = time.time()

print(round(end - start, 3))


start = time.time()
for each in range(10000):
for e in test:
t2(e)
end = time.time()

print(round(end - start, 3))

最终结果使用in查找比find快大改2/5,接近一半的速度差距