根据我的理解(但实际上没有测试),使用len()func计算字符串的len(例如)所花费的时间比简单地计算同一字符串中的字符数导致len()有所优化的时间要少。 是这样吗,用简单的话说是如何工作的?
后续的实际问题可能是:“如果可能的话,通常使用len(string)之类的东西来进行O(code)复杂度方面的代码的早期错误检测是一种好习惯”
谢谢
已更新。 最初,我没有提供任何代码,所以现在只添加它,并希望如果我对它没有太多了解的话,那将有一定的代表性。
import timeit
def len_test(arr):
return len(arr)
def manual_count(num):
ln = 0
i = 0
while i < num:
ln += 1
i += 1
return ln
for i in range(1000, 10000, 1000):
count = i
array = [_ for _ in range(i)]
t1 = timeit.timeit(stmt='len_test(array)', setup='from __main__ import len_test, array', number=count)
t2 = timeit.timeit(stmt='manual_count(count)', setup='from __main__ import manual_count, count', number=count)
print('i: {}, len:{:.8}, count: {:.8}'.format(i, t1, t2))
i: 1000, len:0.0001499, count: 0.12168087
i: 2000, len:0.000327363, count: 0.53221788
i: 3000, len:0.000449699, count: 1.167412
i: 4000, len:0.000595823, count: 2.1061223
i: 5000, len:0.000762714, count: 3.2617024
i: 6000, len:0.000937534, count: 4.8079927
i: 7000, len:0.001076862, count: 6.5171025
i: 8000, len:0.001222231, count: 9.3587468
i: 9000, len:0.001398561, count: 11.686714
答案 0 :(得分:2)
from timeit import default_timer as timer
test = [x for x in range(1000)]
count = 0
start = timer()
len(test)
end = timer()
print(end - start)
start = timer()
for i in test:
count += 1
end = timer()
print(end - start)
返回:
2.643069343567298e-06
213.7110354941546e-06
如果test = "This is a test string."
返回:
2.2654880087719696e-06
1.0572277374269745e-05
答案 1 :(得分:1)
我在真实条件下进行了检查,计数比len()快2倍或更多。
我的代码读取两个CSV格式的文本,然后计算行数是这样的:
import time
import csv
start_time = time.time()
psr = open('e_psr.txt')
cpr = open('e_cp.txt')
csv_psr = csv.reader(psr, delimiter=',')
csv_cp = csv.reader(cpr, delimiter=',')
csv_cp_copy = []
csv_psr_copy = []
r=0
e=0
for row in csv_psr:
csv_psr_copy.append(row)
for row in csv_cp:
csv_cp_copy.append(row)
e = len(csv_cp_copy)
r = len(csv_psr_copy)
psr.close()
cpr.close()
print(e,r)
print("\n--- %s seconds ---" % (time.time() - start_time))
当我在for循环(len()
)中用简单的计数器替换e += 1
时,结果发生了显着变化。
使用len()返回:
10000 10000
--- 0.13390278816223145 seconds ---
带计数器返回
10000 10000
--- 0.05642294883728027 seconds ---