Сперва используйте штатные средства, найдите бутылочное горлышко и оптимизируйте его:

  • cProfile, pydot, graphviz
  • %timeit
  • не создавайте объекты лишний раз (x = x y) != ( x = y)
  • map имеет преимущество перед for обычно только в случае использования builtin в качестве функции. Lambda обычно лучше развернуть в цикл/списковое выражение.
  • если уж совсем поехавшие, можно избавляться от лишних вызовов функций
  • просто старайтесь лишний раз чего-нибудь не делать, один filter(built-in check, list) в цикле может оказаться полезным.

Работа с множествами

При больших объёмах вставка set.add() слегка замедляется из-за проверки на уникальность.

diff = set()
for item in orig_set():
	if something(item):
		diff.add(foo(item))
orig_set.update(diff)
return orig_set

обычно более выгодно, чем

diff = orig_set.copy()
for item in orig_set:
    if something(item):
		diff.add(foo(item))
return diff