python len()比计数更快吗

时间:2018-09-14 07:38:19

标签: python implementation

根据我的理解(但实际上没有测试),使用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

2 个答案:

答案 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 ---