Самый быстрый способ подсчитать до 1 миллиарда в Python
Не имею большого опыта программирования на Python. Мне нужно проверить каждое число от 1 до 1 миллиарда, а затем добавить определенные числа в список. В настоящее время я пытаюсь использовать диапазон ( 0, млрд), но обнаружил, что на моем компьютере с Python 3.3 требуется около 80 секунд. Есть ли гораздо более эффективный способ сделать это?
for i in range(0, Billion)
# if i passes test
i.append(samplelist)
3 ответа
Обычно, если вам нужно выполнить итерацию до 1000000000, есть лучший способ. Например, вы можете использовать некоторые математические свойства, чтобы избежать проверки каждого числа:
samplelist = [x**2 for x in range(int(1000000000**0.5))] # get all perfect squares up to 1000000000
Python не так быстр для числовых операций. Таким образом, итерация до 1000000000 и выполнение чего-либо на каждой итерации будет медленным; нет другого пути, кроме как попробовать более быстрый интерпретатор (например, PyPy) или написать код на более производительном языке, таком как C.
В качестве альтернативы, если вы добавляете огромное количество элементов в список, рассмотрите возможность использования генератора. Это позволит избежать затрат на создание огромного списка, но при этом будет полезно для многих вещей:
def gen_numbers(n):
for i in range(n):
if <i passes test>:
yield i
for i in gen_numbers(1000000000):
print(i)
Нет. Подумайте о коде, который у вас есть с точки зрения машинного времени. К вашим функциям test и append нельзя прикоснуться, поэтому все, что нам осталось, - это играть в диапазоне i. Это ваш базовый цикл for, который настолько прост, насколько это возможно. Вы можете написать цикл while и написать еще одну строку, чтобы увеличить i самостоятельно, но я подозреваю, что это фактически увеличит ваше время выполнения, так как вы делаете больше вызовов интерпретатору python, который затем должен быть обработан.
Если подумать, не могли бы вы оптимизировать свой тестовый режим...
Это должно быть немного быстрее, но большую часть времени, вероятно, тратится на звонки some_test()
samplelist = [i for i in range(1000000000) if some_test(i)]