Я работаю над проблемой SPOJ, INTEST. Цель состоит в том, чтобы указать количество тестовых случаев (n) и делителя (k), а затем подать ваши n номера программ. Программа будет принимать каждое число на новой строке stdin и после получения n-го номера расскажет вам, сколько из них делилось на k.Как получить ДЕЙСТВИТЕЛЬНО быстрый Python через простой цикл
Единственная проблема в этой проблеме - получить ваш код как FAST, потому что k
может быть любым размером до 10^7 и n
может достигать 10^9.
Я пытаюсь записать его на Python и не могу ускорить его. Есть идеи?
Редактировать 2: Я, наконец, получил его, чтобы пройти через 10,54 секунды. Я использовал почти все ваши ответы, чтобы добраться туда, и поэтому было трудно выбрать один из них как «правильный», но я считаю, что тот, который я выбрал, суммирует его как можно лучше. Спасибо вам всем. Итоговый код прохождения ниже.
Редактировать: я включил некоторые из предлагаемых обновлений во включенном коде.
Расширения и сторонние модули не допускаются. Код также управляется судовой машиной SPOJ, поэтому у меня нет возможности сменить интерпретаторы.
import sys
import psyco
psyco.full()
def main():
from sys import stdin, stdout
first_in = stdin.readline()
thing = first_in.split()
n = int(thing[0])
k = int(thing[1])
total = 0
list = stdin.readlines()
for item in list:
if int(item) % k == 0:
total += 1
stdout.write(str(total) + "\n")
if __name__ == "__main__":
main()
Вы пробовали читать большие куски? вы профилировали его, чтобы узнать, какие операции являются самыми дорогими? можете ли вы уменьшить силу работы мод? можете ли вы использовать функцию сопоставления для использования своих базовых циклов c? Я не знаю, что любой из них поможет, но ясно, что проблема не является алгоритмической сложностью ... – msw
Хм, я не уверен ни в одной из этих вещей. Вся причина, по которой я пытаюсь решить эту проблему, - это выяснить, как быстро я могу запустить python и как его можно оптимизировать. Речь идет не об алгоритмических трудностях, это необработанная скорость в этой проблеме. –