Вы можете улучшить, используя Счетчик , в 2.
для каждого элемента, вы перебираете весь список, и вы делаете это несколько раз для одного и того же пользователя, если пользователь встречается более одного раза.
Обратите внимание, что при использовании users.count(user)
вы просматриваете весь список пользователей, чтобы подсчитать, сколько раз пользователь встречается. Это означает квадратичную c сложность по отношению к длине списка.
Используя счетчик, вы можете решить его с линейной сложностью.
Кроме того, в 4.
вы повторяете и снова подсчитываете, в то время как вы могли бы просто удалите те, которые вы только что вычислили, из целых пользователей.
Пример.
>>> one_time_users = {user for user,cnt in Counter(users).items() if cnt == 1}
{'UserC', 'UserD'}
>>> returning_users = set(users) - one_time_users
>>> returning_users
{'UserB', 'UserA'}
или более непосредственно
one_time_users, returning_users = [], []
for user,cnt in Counter(users).items():
if cnt==1:
one_time_users.append(user)
else:
returning_users.append(user)
Здесь сравнение l.count(el)
против Counter(l)
.
>>> l = random.choices(range(500), k=60000)
>>> timeit.timeit('[el for el in l if l.count(el) == 1]',setup='from __main__ import l',number=1)
71.70409394335002
>>> timeit.timeit('[el for el,cnt in Counter(l).items() if cnt == 1]',setup='from __main__ import l, Counter',number=1)
0.005492186639457941