Как намеренно замедлить работу скрипта на python, чтобы он мог работать вечно в фоновом режиме, пока я работаю?
В общем, у меня есть список из 300 значений и различных средних значений, связанных с каждым.
у меня есть for
-loop, который генерирует список из десяти этих значений случайным образом и записывает его, чтобы преуспеть, если определенные условия выполняются на основе их средних.
Код работает нормально, если я перебираю 10 миллионов раз или меньше, но это на несколько порядков меньше. Даже если я просто удвою счетчик цикла for до 20 миллионов, мой компьютер станет непригодным для использования во время работы.
Я хочу повторить цикл 100 миллионов или даже 1 миллиард раз. Я хочу, чтобы он работал медленно в фоновом режиме, мне все равно, если потребуется 24 часа, чтобы добраться до результатов. Я просто хочу использовать свой компьютер, пока он работает. В настоящее время, если цикл for превышает 10 миллионов, использование памяти и дисков моего ноутбука увеличивается до 99%.
С помощью pyScripter
и питон 3.3
Технические характеристики: Intel Core i7 4700HQ (2,40 ГГц), 8 ГБ памяти, 1 ТБ жесткого диска, NVIDIA GeForce GTX, 850 МБ, 2 ГБ, GDDR3
Фрагмент кода:
for i in range( 0, cycles ):
genRandLineups( Red ); #random team gens
genRandLineups( Blue );
genRandLineups( Purple );
genRandLineups( Green );
if sum( teamAve[i] ) <= 600
and ( ( sum( teamValues[i] ) > currentHighScore )
or sum( teamValues[i] ) > 1024
):
teamValuesF.append( teamValues[i] )
sheetw.write( q, 0, str( teamValues[i] ) )
ts = time.time()
workbookw.save( "Data_Log.xls" )
st = datetime.datetime.fromtimestamp( ts ).strftime( '%Y-%m-%d %H:%M:%S' )
sheetw.write( q, 3, st )
q = q + 1
if sum( teamValues[i] ) > currentHighScore:
currentHighScore = sum( teamValues[i] )
2 ответа
Во-первых, я подозреваю, что ваша настоящая проблема заключается в том, что вы просто сохраняете слишком много памяти, что приводит к тому, что ваш компьютер запускается подкачки виртуальных машин, что замедляет ваш компьютер. Вы должны действительно попытаться исправить это, вместо того, чтобы пытаться делать это периодически в течение дня, а не постоянно.
В частности, звучит так, будто вы держите список значений 10N навсегда. Вам действительно нужно это сделать?
Если нет, начните освобождать их. (Или не храните их в первую очередь. Одна из распространенных проблем, с которой сталкиваются многие люди, заключается в том, что им нужно 1 миллиард значений, но только по одному за раз, через цикл, и они сохраняют их в списке, когда они могли бы использовать итератор. Это в основном общая версия знакомой readlines()
проблема.)
Если так, посмотрите на какое-нибудь эффективное дисковое хранилище вместо памяти или что-то более компактное, например, массив NumPy вместо списка.
Но в то же время, если вы хотите уменьшить приоритет программы, самый простой способ сделать это может быть внешне. Например, на большинстве платформ, кроме Windows, вы можете просто запустить свой скрипт с nice 20 python myscript.py
и ОС даст всему остальному больше процессорного времени, чем ваша программа.
Но чтобы ответить на ваш прямой вопрос, если вы хотите замедлить работу скрипта изнутри, это довольно легко сделать: просто позвоните sleep
очень часто Это заставляет ОС приостанавливать работу вашей программы и не давать вам никаких ресурсов, пока не истечет указанное количество секунд. Это может быть только приблизительным, а не абсолютно ничем в течение ровно N секунд, но это достаточно близко (и настолько хорошо, насколько вы можете сделать).
Например:
for i in range(reps):
do_expensive_work():
if i % 100 == 99:
time.sleep(10)
Если do_expensive_work
занимает 18 мс, вы будете сжигать процессор в течение 1,8 секунд, затем спать в течение 10 и повторить. Я сомневаюсь, что это именно то поведение, которое вы хотите (или что это занимает 18 мс), но вы можете настроить цифры. Или, если время является переменным, и вы хотите, чтобы процент сна был постоянным, вы можете измерять время и спать каждые N секунд с момента последнего сна, а не каждые N повторений.
Не замедляйся. Скорее перепроектировать и вступить в HPC
Для высокопроизводительной обработки всего лишь "нескольких" элементов (список из 300 значений) лучшее будет состоять из:
избегать доступа к файлам (даже если они редкие, как указано в OP) - кэшируйте TruePOSITIVEs в
anOutputSTRING
это существоfileIO
- в конце или после ограничения длины струны или направляется на другую, удаленную, каротажную машину.переместить всю высоко итеративную обработку, скажем, в span
10E+006
-10E+009
циклы, на массивно-параллельную обработку ядра GPU/CUDA на GPU, которая у вас уже есть в ноутбуке, как для освобождения ресурсов вашего процессора, так и для получения преимуществ от 640 потоков, обеспечивающих около 1,15 TFLOP вычислительной мощности параллельного двигателя, в отличие от всего лишь несколько MFLOP с общим графическим интерфейсом от ядер ЦП.