Если ваши хромосомы являются цепочками бит фиксированной длины, рассмотрите возможность использования Numpy массивов и векторизованных операций над ними вместо списков. Они могут быть намного быстрее, чем списки Python. Например, одноточечный кроссовер можно сделать с помощью
def crossover(a, b):
"""Return new individual by combining parents a and b
with random crossover point"""
c = np.empty(a.shape, dtype=bool)
k = np.random.randint(a.shape[0])
c[:k] = a[:k]
c[k:] = b[k:]
return c
Если вы не хотите использовать Numpy, тогда строки кажутся вполне подходящими; они гораздо более компактны, чем списки, в которых хранятся указатели на элементы, а не на реальные элементы.
Наконец, обязательно посмотрите, как Pyevolve представляет хромосомы; похоже, это делается с помощью Numpy.