Найти - Пользователи
Полная версия: Питон и производительность
Начало » Python для экспертов » Питон и производительность
1 2 3
nerezus
Всегда думал, что питон очень быстрый(собственно по отношению к перлам и т.д. он в разы быстрее).
Ну понятно, что нативным компилируемым он в полторы сотни раз проигрывает, но это ожидаемо.

Выбираю для игры скриптоывй движок.
Попробовал луа. Ну что ж, с чистым питоном разница в ~10раз, а питон с JIT(psyco) еще 30% теряет.

Есть ли для питона нормальные реализации JIT? (Как сказал выше, тот же psyco сильно(30%) замедляет скрипт и вообще давно не развивается).

Или придется использовать lua?
slav0nic
или рефакторить код;)
показал бы какая задача
crchemist
psyco прискорює приблизно в разів 10. Код просто переробити треба. http://psyco.sourceforge.net/psycoguide/node29.html
shiza
быстрее я думаю не сделать =)
если настолько критично - бери lua c LuaJIT =)
crchemist
A performance killer is the usage of the built-in functions map and filter. Never use them with Psyco.
Може через це код повільніший?
nerezus
или рефакторить код
показал бы какая задача
Задача тестовая. Буду писать игру с просчетом всех объектов через скрипт.

psyco прискорює приблизно в разів 10
Не знаю, но на простом примере в вызовах методов, циклах и сравнении он показал на 30% худший резултат.
+ проект умер.

если настолько критично - бери lua c LuaJIT
С ним и сравнивал. Просто луа в ~3.5 раз быстрее питона без JIT.
crchemist
nerezus
но на простом примере в вызовах методов, циклах и сравнении он показал на 30% худший резултат.
покажи код
nerezus
Base = {}
Base.field = 0

function Base:setField(value)
self.field = value
end

function Base:getField()
return self.field
end

local start = os.time()
local base = {}
setmetatable(base, {__index = Base})
local i = 0
while i < 10000 do
local j = 0
while j < 10000 do
if (i + j) % 2 == 0 then
base:setField(base:getField() + 1)
end
j = j + 1
end
i = i + 1
end

--print(base:getField())
print(os.time() - start)
import time

class Base(object):
def __init__(self):
self.field = 0
def setField(self, value):
self.field = value
def getField(self):
return self.field

start = time.time()
base = Base()
i = 0
while i < 10000:
j = 0
while j < 10000:
if (i + j) % 2 == 0:
base.setField(base.getField() + 1)
j += 1
i += 1

#print(base.getField())
print int(round(time.time() - start))
#include <iostream>
#include <ctime>
using namespace std;

class Base {
protected:
int field;
public:
Base() {
field = 0;
}
void setField(int value) {
field = value;
}

int getField() {
return field;
}
};

int main() {
Base base;
time_t start = time (NULL);
int i = 0;
while (i < 10000) {
int j = 0;
while (j < 10000) {
if ((i + j) % 2 == 0) {
base.setField(base.getField() + 1);
}
++j;
}
++i;
}
cout << base.getField() << endl;
cout << time(NULL) - start << endl;
return 0;
}
nerezus
Може через це код повільніший?
Нет, без built-in ф-ий делал тестовый скрипт.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB