Это отображается в Process Explorer, где я запускаю Python сценарии, связанные с гипотезой Коллатца. Чтобы не отвлекаться на сложность этих сценариев, я создал этот минимальный сценарий, чтобы продемонстрировать проблему: -
import time
import psutil
import random
p = psutil.Process()
p.cpu_affinity([4]) # Lock to a CPU to eliminate this as a cause of variation.
print('cpu affinity', p.cpu_affinity())
random.seed(123456789)
bits = 7091330
n = random.getrandbits(bits) # Generate a very large number.
print(bits, 'bits')
t0= time.perf_counter()
for i in range(100000):
m = 3 * n # Do something with the very large number.
t1= time.perf_counter()
print('ran in %f seconds' % (t1 - t0))
print(p.cpu_times())
mi = p.memory_info() # Get page fault statistics.
for field in mi._fields:
print(field, getattr(mi, field))
Когда он запускается, иногда он вызывает много ошибок страницы и занимает больше времени, иногда нет : -
cpu affinity [4]
7091330 bits
ran in 43.947864 seconds
pcputimes(user=41.5, system=0.21875, children_user=0.0, children_system=0.0)
rss 27992064
vms 20475904
num_page_faults 7421
peak_wset 27996160
wset 27992064
peak_paged_pool 200808
paged_pool 200632
peak_nonpaged_pool 19296
nonpaged_pool 18944
pagefile 20475904
peak_pagefile 20475904
private 20475904
cpu affinity [4]
7091330 bits
ran in 48.507077 seconds
pcputimes(user=42.03125, system=4.625, children_user=0.0, children_system=0.0)
rss 27144192
vms 20529152
num_page_faults 3034148
peak_wset 28934144
wset 27144192
peak_paged_pool 200808
paged_pool 200632
peak_nonpaged_pool 19296
nonpaged_pool 18944
pagefile 20529152
peak_pagefile 21413888
private 20529152
Я запускаю это с Python 3.4.2 под Windows 10 на процессоре i7-4790 с 16 ГБ ОЗУ. Изменение приоритета процесса не имеет никакого эффекта. Изменение константы 3 в for l oop на другое небольшое число не имеет никакого эффекта. Удвоение размера числа n приблизительно удваивает количество ошибок на странице. В каждой итерации для l oop число ошибок страниц увеличивается либо на ноль, либо примерно на 1/30800 от числа битов в n.
Я обнаружил, что ошибки страниц в l oop могут быть исключено, если «Делать что-то с очень большим числом» ограничено операциями на месте, такими как * =, // =, et c. Также может быть необходимо использовать целочисленный тип с множественной точностью gmpy2 xmpz для очень большого числа.