эффективность конкатенации списка Python

Я думаю, вы можете сделать следующее:

$(function() {
  $("div:empty").hide();
});

Псевдоселектор jQuery пуст велик.

16
задан Thorfin 23 August 2012 в 11:56
поделиться

1 ответ

enter image description here

itertools.chain просто делает генератор, поэтому если можно сойти с рук использование генератора вместо списка, это - постоянное время для генерации, но Вы оплачиваете стоимость при доступе к каждому элементу. Иначе list_a[0:0] = list_b приблизительно в 6 раз быстрее, чем list_a = list_b + list_a

, я думаю, что list_a = list_b + list_a самый читаемый выбор, и это уже довольно быстро.

два метода, что Вы упомянули, что используют append() в for, цикл является неприменимо медленным, таким образом, я не беспокоился включая их.

<час>

Работал с Python 3.7.5 [Clang 11.0.0 (clang-1100.0.33.8)] on darwin на Двухъядерном Intel Core i5 на 1,6 ГГц с 16 ГБ LPDDR3 RAM на 2 133 МГц с помощью следующего кода:

from timeit import timeit
import random
import matplotlib.pyplot as plt

num_data_points = 1000
step = 10
methods = [
    # ordered from slowest to fastest to make the key easier to read
    # """for item in list_a: list_b.append(item); list_a = list_b""",
    # """for item in list_b: list_a.insert(0, item)""",
    # "list_a = list(itertools.chain(list_b, list_a))",
    "list_a = list_b + list_a",
    "list_a[0:0] = list_b",
    "list_a = itertools.chain(list_b, list_a)",
]

x = list(range(0, num_data_points * step, step))
y = [[] for _ in methods]
for i in x:
    list_a = list(range(i))
    list_b = list(range(i))
    random.shuffle(list_a)
    random.shuffle(list_b)
    setup = f"list_a = {list_a}; list_b = {list_b}"
    for method_index, method in enumerate(methods):
        y[method_index].append(timeit(method, setup=setup, number=30))
    print(i, "out of", num_data_points * step)

ax = plt.axes()
for method_index, method in enumerate(methods):
    ax.plot(x, y[method_index], label=method)
ax.set(xlabel="number of elements in both lists", ylabel="time (s) (lower is better)")
ax.legend()
plt.show()
0
ответ дан 30 November 2019 в 16:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: