добавить медленнее с целым числом, чем строка в Python? - PullRequest
0 голосов
/ 19 марта 2019

Я сталкивался с этим кодом, когда искал способ измерения скорости функций.

def test():
    """Stupid test function"""
    L = []
    for i in range(100):
        L.append(i)

if __name__ == '__main__':
     import timeit
     print(timeit.timeit("test()", setup="from __main__ import test"))

когда я запускаю его, это занимает около 10 секунд, что очень странно для меня. Напоминаю, что когда я добавляю 100 000 строк в строку, это занимает всего 0,06 секунды. почему добавление 100 целых чисел в список занимает 10 секунд? вот код, который я использую для добавления stringt в список.

def wordlist1():
    fin = open("words.txt")
    word_list = []
    for line in fin:
        word = line.strip()
        word_list.append(word)
    return word_list

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Я думаю, что ваша проблема заключается в использовании модуля timeit.Если не указано, параметр number по умолчанию равен 1e6.Итак, вы фактически измеряете, сколько времени потребуется, чтобы добавить сто чисел в массив 1e6 раз.

Чтобы убедиться в этом, я использовал этот фрагмент кода:

import timeit

alist = list(range(100))

L = []

def test():
    for i in alist:
        L.append(i)

elapsed = timeit.timeit("test()", setup="from __main__ import test, alist, L", number=1000000)

print('average time elapsed', elapsed/1000000)

На моеммашина, я получил следующий результат:

7.74517...e-06

Я не знаю, как вы измерили функцию добавления для вашего TXT-файла, но вы можете попробовать протестировать его таким же образом.

1 голос
/ 19 марта 2019

Если вы используете iPython, вы можете увидеть более четкое объяснение результатов, используя магическую команду %timeit.

In [1]: def test():
   ...:     """Stupid test function"""
   ...:     L = []
   ...:     for i in range(100):
   ...:         L.append(i)
   ...:

In [2]: %timeit test()
7.12 µs ± 22.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

Здесь результат составляет в среднем 7,12 микросекунды на вызов до test, при этом среднее значение вычисляется по 7 наборам из 100 000 вызовов до test. Это согласуется с 7,75 микросекундами, сообщенными Докдривеном в его ответе .

0 голосов
/ 19 марта 2019

Попробуйте это

def test ():

L = []

для i в диапазоне (100)

    count + = i

    L.append(count )

    return count 
...