import time as dt
success = True
can_test = True
time = 0
for i in range(10000000):
start = dt.time()
if success and can_test:
stop = dt.time()
time+= stop-start
print(f'"and" operation took: {time} seconds')
time = 0
for i in range(10000000):
start = dt.time()
if success or can_test:
stop = dt.time()
time += stop-start
print(f'"or" operation took: {time} seconds')
当我运行上面的python程序时,我期望and操作比or操作慢(因为我学到短路会减少执行的时间)。 然而,结果不仅恰恰相反,而且还在波动。 我能理解波动! (由于后台进程)。 但为什么结果却相反呢! 发生什么事了?
下面是一个示例结果。
"and" operation took: 5.200342893600464 seconds
"or" operation took: 5.3243467807769775 seconds
那是一个有趣的问题,所以我决定深入调查你主要关心的问题。
# required modules line_profiler, matplotlib, seaborn abd scipy
import time as dt
from line_profiler import LineProfiler
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
success = True
can_test = True
def and_op():
for x in range(2000):
s = success and can_test
def or_op():
for x in range(2000):
s = success or can_test
or_op_list = []
for x in range(0,1000):
lp = LineProfiler()
lp_wrapper = lp(or_op)
lp_wrapper()
lstats = lp.get_stats()
total_time = 0
for v in lstats.timings.values():
for op in v:
total_time += op[-1]
final = op[-1]
operator = final/total_time
or_op_list.append(operator)
and_op_list = []
for x in range(0,1000):
lp = LineProfiler()
lp_wrapper = lp(and_op)
lp_wrapper()
lstats = lp.get_stats()
total_time = 0
for v in lstats.timings.values():
for op in v:
total_time += op[-1]
final = op[-1]
operator = final/total_time
and_op_list.append(operator)
sns.kdeplot(and_op_list, label = 'AND')
sns.kdeplot(or_op_list, label = 'OR')
plt.show()
print(stats.ttest_ind(and_op_list,or_op_list, equal_var = False))
Pvalue=1.8293386245013954e-103
实际上,与“与”运算相比,“或”在统计上是显著的并且是不同的