Скорость Python 32 против 64-битной проблемы с Windows

У меня были проблемы с производительностью при перемещении приложений между 32-битной Windows 7 и 64-битной Windows Server 2008, обе с одинаковыми процессорами. Я написал тривиальную программу для проверки производительности распределения памяти, чтобы увидеть разницу. Это показывает, что создание списков на 64-битных окнах занимает почти в 10 раз больше времени, чем на 32-битных окнах. Использование python 2.6.5 на 32 и 2.6.6 на 64. Что может быть причиной проблемы? Я написал небольшую программу на 'c', чтобы сделать то же самое, и она показала, что 64-битный сервер работает быстрее. Так что же происходит?

#silly python memory allocation test
from datetime import datetime
import random

d = datetime.now()
listo = [1] * 300000
del listo
print datetime.now()-d
d = datetime.now()
listo = [1] * 3000000
del listo
print datetime.now()-d
d = datetime.now()
listo = [1] * 30000000
print datetime.now()-d

результат на 32

0:00:00.002000
0:00:00.024000
0:00:00.166000

результат на 64

0:00:00.031000
0:00:00.156000
0:00:02.672000

Есть ли какая-то нерешенная проблема с Python и производительностью памяти в 64-битных окнах?

64 Установка Windows 2008 R2 Server

4 процессора, 16 ГБ памяти, 20 ГБ диска C, сеть 10 ГБ/с Xeon X5570 @ 2,93 ГГц

32 ПК с Windows 7

2 ЦП, 2 ГБ памяти, диск C 500 ГБ, сеть 1 Гбит/с Core 2 duo @ 3,00 ГГц


person Martlark    schedule 22.03.2011    source источник
comment
Старайтесь использовать лучшее время, например docs.python.org/library/timeit.html. . Спасибо   -  person eat    schedule 22.03.2011
comment
Я только что использовал timeit для трех ваших примеров в 64-разрядной версии Windows 7 с Python 2.6.5. Мне пришлось добавить del, чтобы он не сокращал фактическое создание. Мои времена очень хорошо совпадают с вашими 32-битными временами. Насколько быстр ваш компьютер и сколько у вас оперативной памяти?   -  person Justin Peel    schedule 22.03.2011


Ответы (3)


Я не знаю, почему это так долго, но вы должны ожидать немного больше времени, потому что в этом примере программа выделяет двойную память в 64-битном режиме, как и в 32-битном режиме, поскольку python использует 32/64-битные указатели в его списках.

Это может отличаться в C, когда вы все еще используете 32-битные типы данных.

person nils    schedule 22.03.2011
comment
Да, возможно, он просто переступает порог, из-за которого запускается сборщик мусора. - person Gabe; 22.03.2011
comment
@Gabe - или выталкивает набор данных из кеша L3. - person atzz; 22.03.2011
comment
@atzz: Он создает список из 30 миллионов целых чисел, что составляет 120 МБ на 32-битной машине. Это чертовски кеш L3! :) - person Gabe; 22.03.2011
comment
@Gabe - да, наверное, я упустил из виду пару порядков :) - person atzz; 22.03.2011

Проблема вызвана использованием программного обеспечения виртуальной машины на сервере Windows.

person Martlark    schedule 12.04.2011
comment
@BenSapp У меня нет никаких подробностей о том, почему. Но производительность того же кода без программного обеспечения виртуального сервера была почти одинаковой для 64-битного и 32-битного Python. Я использую корпоративный материал VMware на сервере Windows 2010 64. - person Martlark; 30.11.2011
comment
Интересно. Я на виртуальной машине Server 2008 R2 на VMWare (бесплатная версия). Причина, по которой я спрашиваю, заключается в том, что я около недели бился головой о django (OSQA) на python 2.7, пытаясь заставить его работать лучше. Когда я нажимаю на страницу, процессор на виртуальной машине обычно загружается до 50%, а среднее время отклика составляет 400-700 мс. Когда я запускаю нативную версию Win7 64 (32-битный Python), это практически не влияет на процессор и приличное (~ 130 мс) время отклика. Большая разница! - person HAL9000; 30.11.2011

У меня была еще одна проблема с Python 2.7 и 64-битной версией. Я запускаю программу, которая в 32-битном Python вызывала переполнение памяти на меньшем компьютере. Меня интересовало, будет ли использоваться моя большая оперативная память. И, конечно, это было. Максимум до 10 Гб и машина зависла. Пришлось отключить питание и перезагрузить компьютер.

person Knut Angstrom    schedule 09.01.2012
comment
Я использовал до 92 гигабайт с 64-битным python на Windows Server 2010. Это был максимум, который мог поддерживать блейд-сервер, поэтому мне пришлось изменить свой код, чтобы использовать меньше памяти. Использование 10 гигабайт доставило мне нервы. - person Martlark; 10.01.2012