Вот более питоническое решение:
a, b = set(a_iter), set(b_iter)
return a - b, b - a
Pythonic означает не быстрый, а скорее элегантный и читабельный.
Вот решение, которое может быть быстрее:
a, b = set(a_iter), set(b_iter)
# Get all the candidate return values
symdif = a.symmetric_difference(b)
# Since symdif has much fewer elements, these might be faster
return symdif - b, symdif - a
Теперь о написании пользовательских «быстрых» алгоритмов на Python вместо использования встроенных операций: это очень плохая идея.
Операторы множеств сильно оптимизированы и написаны на C, что, как правило, намного, намного быстрее, чем Python.
Вы можете написать алгоритм на C (или Cython), но помните, что алгоритмы множеств Python были написаны и оптимизированы гениями мирового класса.
Если вы не очень хороши в оптимизации, это, вероятно, не стоит усилий. С другой стороны, если вам удастся существенно ускорить процесс, поделитесь кодом; Могу поспорить, что у него будет шанс попасть в сам Python.
Для более реалистичного подхода попробуйте исключить вызовы кода Python. Например, если у ваших объектов есть пользовательский оператор равенства, найдите способ его удалить.
Но не надейтесь. Работа с миллионами фрагментов данных всегда займет много времени. Я не знаю, где вы это используете, но, может быть, лучше заняться компьютером на минуту, чем тратить время на оптимизацию алгоритмов набора?