Есть способ вычислить делители путем разложения числа на простые множители. Учитывая простое разложение, вычисление делителей происходит быстрее, чем пробное деление (которое вы делаете здесь).
Но разложение на простые множители должно быть быстрым. Для небольших чисел наличие предварительно рассчитанного списка простых чисел (легко сделать) может ускорить факторизацию простых чисел и быстрое вычисление делителей. Если вы знаете верхний предел проверяемых чисел (назовем его L
), тогда вам понадобятся простые числа до sqrt(L)
. Учитывая простое разложение числа n = p_1^e_1 * p_2^e_2 * .. * p_k^e_k
, количество делителей будет просто (1+e_1) * (1+e_2) * .. * (1+e_k)
Более того, вы можете предварительно вычислить и / или запомнить количество делителей некоторых чрезмерно используемых числа до некоторого предела. Это сэкономит много времени, но увеличит объем памяти, иначе вы можете рассчитать его напрямую (например, используя предыдущий метод).
Кроме того, вы можете немного оптимизировать код. Например, вы можете избежать постоянного преобразования int(t)
(и тому подобного), сделать это один раз и сохранить в переменной.
Numpy
можно вообще избежать, это лишнее, и я сомневаюсь, что добавляет любое преимущество в скорости зависит от этого.
Это должно сделать ваш код быстрее, но всегда нужно измерять производительность с помощью реальных тестов.