在编程学习中我们会遇到一些可以循环调用函数解决,也可以在函数中实现循环解决的问题,那么这两种方式那种比较好呢?
在Python的环境下编写了下面的代码用于记录两种方式的运行时间:
import time
li_1 = []
li_2 = []
def Fortest(i):
li_1.append(i)
def ForGo_1():
start = time.clock()
for i in range(1000000):
Fortest(i)
end = time.clock()
print('Running_1 time: %s Seconds'%(end-start))
def ForGo_2():
start = time.clock()
for i in range(1000000):
li_2.append(i)
end = time.clock()
print('Running_2 time: %s Seconds'%(end-start))
ForGo_1()
ForGo_1和ForGo_2都完成向数组中添加元素的操作(使用 append() 实现),ForGo_1使用循环调用函数的操作,ForGo_2使用函数中实现循环的操作,每次都执行一次ForGo_1或ForGo_2,对数据进行记录,得到结果如下表。
输入规模 | 循环调用函数1 | 循环调用函数2 | 循环调用函数3 | 循环调用函数平均时间 | 函数内实现循环1 | 函数内实现循环2 | 函数内实现循环3 | 函数内实现循环平均时间 |
1 | 5.90E-06 | 6.40E-06 | 7.10E-06 | 6.46667E-06 | 5.90E-06 | 5.90E-06 | 5.40E-06 | 5.73333E-06 |
10 | 4.00E-06 | 3.90E-06 | 4.00E-06 | 3.96667E-06 | 3.00E-06 | 3.10E-06 | 3.30E-06 | 3.13333E-06 |
100 | 1.69E-05 | 1.94E-05 | 1.81E-05 | 1.81333E-05 | 9.90E-06 | 2.58E-05 | 1.13E-05 | 1.56667E-05 |
1000 | 1.65E-04 | 3.86E-04 | 3.04E-04 | 0.000284833 | 8.29E-05 | 0.0001108 | 8.30E-05 | 9.22333E-05 |
10000 | 2.05E-03 | 1.76E-03 | 1.86E-03 | 0.0018908 | 0.0009889 | 0.0010914 | 0.0010114 | 0.001030567 |
100000 | 1.79E-02 | 1.75E-02 | 2.15E-02 | 0.018951367 | 0.0140541 | 0.00991 | 0.0109394 | 0.0116345 |
1000000 | 2.10E-01 | 2.31E-01 | 2.21E-01 | 0.220984 | 0.134838 | 0.1489554 | 0.1428021 | 0.1421985 |
对两种方式三次的平均时间进行折线图的绘制,得到结果如下图。
可以看出随着向数组中添加元素次数的增多,循环调用函数的用时会逐渐大于函数中实现循环的方式,但是这也是在添加元素操作足够多的情况下的,这两种方式的好与坏还是要看实际情况而定的,在数据量较少的情况下,使用循环调用函数的方式在逻辑上可能会方便一些,当数据量足够大的时候,函数中实现循环的方式在用时方面会优于循环调用函数的方式,如果那时还用这种方式实现的话。