性能优化实战-逻辑运算and和or优化
依据
逻辑运算中,and,也就是”与“,代表必须所有条件为真,结果才为真,也可以理解为,只要有一个条件为假,结果就为假。
逻辑运算中,or,也就是“或”,代表只要有一个条件为真,结果即为真。
利用这两个特性,我们在编程中,可以进行时间复杂度优化。
如何优化?
答案是,将时间复杂度较低的操作,放在逻辑运算符的最左边。
原因:
只要and表达式第一个结果为假,则后面的操作则略过;
只要or表达式第一个结果为真,则后面的操作也略过。
来看代码例子
没有经过优化的代码:
import timeit
def find_member(arg_arr):
dist_arr = ["Jan.", "Feb.", "Mar.", "Apr.", "May.", "June.", "July.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."]
for i in arg_arr: # 循环遍历元素,时间复杂度为O(n)
if i in dist_arr: # 每个元素都要做一次成员判断,时间复杂度为O(n),有N个元素,则总的时间复杂度为O(n^2)
print("找到成员", i)
if __name__ == "__main__":
my_arr = ["a", "b", "c", "Jan", "June.", "Oct."]
start = timeit.default_timer()
find_member(my_arr)
print("%0.9fs" % (timeit.default_timer() - start))
输出:
找到成员 June.
找到成员 Oct.
0.000042272s
经过优化的代码:
import timeit
def find_member(arg_arr):
dist_arr = ["Jan.", "Feb.", "Mar.", "Apr.", "May.", "June.", "July.", "Aug.", "Sept.", "Oct.", "Nov.", "Dec."]
for i in arg_arr: # 循环遍历元素,时间复杂度为O(n)
# if i in dist_arr:
if i[-1] == "." and i in dist_arr: # 首先做下标取值和判断操作,时间复杂度为O(1),如果结果为假,则后面的成员判断操作O(n)则略过。总的时间复杂度小于O(n^2)。
print("找到成员", i)
if __name__ == "__main__":
my_arr = ["a", "b", "c", "Jan", "June.", "Oct."]
start = timeit.default_timer()
find_member(my_arr)
print("%0.9fs" % (timeit.default_timer() - start))
输出:
找到成员 June.
找到成员 Oct.
0.000018173s
结语
这里只是举例,数据体量并不大,看到的时间优化提升比较小,但是,线上高并发系统加上庞大的数据体量,这个提升,就是显而易见的。