Попытка рассчитать время оператора «in»Python

Программы на Python
Ответить
Anonymous
 Попытка рассчитать время оператора «in»

Сообщение Anonymous »

У меня возник вопрос о том, как внутри работает оператор in. Поэтому, чтобы проверить это, я попытался построить график времени, необходимого для поиска члена списка в разных частях списка.

Код: Выделить всё

import time
import matplotlib.pyplot as plt

# list size
size = 100000
# number of points
n = 100000

# display for not having to count zeros
if size >= 1000000:
new_size = str(int(size/1000000))+"M"
else:
new_size = str(int(size/1000))+"K"

if n >= 1000000:
new_n = str(int(n/10000000))+"M"
elif n >= 1000:
new_n = str(int(n/1000))+"K"
else:
new_n = n

lst = list(range(size))
result = []
for number in range(0,size+1,int(size/n)):
start_time = time.time_ns()
if number in lst:
end_time = time.time_ns()
total_time = (end_time-start_time)/1000000000 #convert ns to seconds
result.append([total_time,number])
print(number,total_time)

x_values, y_values = zip(*result)
plt.scatter(x_values, y_values, c='red', marker='o',s=5)
plt.xlabel('Time (sec)')
plt.ylabel('Number')
plt.title(f'List length: {new_size}\nNumber of points: {new_n}\n\nTime to find number in list')
plt.grid(True)
plt.show()
Из того, что я видел, внутри работает вызов https://docs.python.org/3/reference/dat ... ct.[b]iter[/b], который последовательно принимает все элементы итерации, начиная с первого. Поэтому я ожидаю, что дальнейший поиск в списке будет занимать все больше и больше времени.

Список должен быть больше определенной длины, чтобы Python требовал достаточно много времени, чтобы найти число, которое мы можем измерить, но, возясь с разными размерами списков и количеством точек, я обнаружил, что точки группируются вокруг вертикальных линий с интервалом, кратным 0,001 с, что для меня очень странно. Я мог видеть несколько горизонтальных линий, образующихся из-за внутренней работы Python, но не вертикальных. Я даже использовал time.time_ns(), чтобы добиться еще большей точности времени, но это все равно происходит.

Я имею в виду, как может потребоваться одно и то же время, чтобы найти 539 и 94,598 внутри [0,1, ... 100000] список, если он всегда начинается с 0?
Изображение

Не стесняйтесь попробовать код самостоятельно.

Надеюсь, я не нашел Я не напутал чего-то явно очевидного.

Подробнее здесь: https://stackoverflow.com/questions/792 ... n-operator
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»