Форум сайта python.su
Здравствуйте!
Написал программу, а она зело медленно работает. Посему решил ознакомиться с таким чудом человеческой мысли, как профилировка. Сначала сделал как здесь http://docs.python.org/library/profile.html - то бишь написал cProfile.run('simulate(1000, 10)') , а питон мне в ответ NameError: name ‘simulate’ is not defined, хотя без профилирования это же выражение замечательно работает. Затем ещё немного поискал и нашёл сие http://habrahabr.ru/blogs/python/110537/ , сделал как предлагается через hotshot, но в результате получается файл всего ничего в 423 байта, среди которых интересующей меня информации ровно ноль.
Что я делаю не так?
Заранее благодарен.
Офлайн
profile = cProfile()
profile.runcall(simulate, 1000, 10)
profile.dump_stats('profiler.data')
Офлайн
Я почему-то предпочитал вместо runcall использовать runctx('simulate(1000, 10)', globals(), locals())
http://docs.python.org/library/profile.html?highlight=runctx#cProfile.runctx
Офлайн
Премного благодарен! Через runctx получилось. Однако вопросов это не решило, а поставило ещё ряд вопросов. Не знаю, как принято на настоящем форуме насчёт разделения тем, посему задам их пока что здесь. Вопросы, наверное, глупые.
В общем, у меня система - трёхмерный массив, а в каждой клетке может быть или не быть частица, причём эти частицы ещё могут двигаться (на одну клетку за раз). Пока что движутся случайно, потом будут двигаться по показаниям нейронной сети. И чтобы они при движении не попадали по несколько в одну и ту же клетку, я строю систему на следующем шаге и последовательно отменяю движение у неправильно движущихся частиц.
А вопросы следующего характера. В процессе вышеуказанного действа в основном мне надо выполнять операции трёх видов - копирование массива, поэлементное применение функции к одному массиву с записью результатов в другой массив и проход по ячейкам массива, но не просто так, а чтобы можно было узнавать и изменять значения соседних клеток, а также клеток с этими же координатами в других массивах. Массивы у меня из numpy.
Так вот, для первых двух задач я написал такую функцию:
def assign3d(dst, fun, src):
xr=range(src.__len__())
yr=range(src[0].__len__())
zr=range(src[0, 0].__len__())
for i in xr:
for j in yr:
for k in zr:
dst[i, j, k]=fun(src[i, j, k])
Офлайн
а можно пример этого самого массива src
Офлайн
Ну вот как-то так они объявляются.
def map2d(f, a):
return map(lambda b: map(f, b), a)
def map3d(f, a):
return map(lambda b: map2d(f, b), a)
def bernoulli(mean):
return 0 if random.random()>mean else 1
def randarray3d(x0, y0, z0, mean):
x, y, z = ogrid[0:x0:1, 0:y0:1, 0:z0:1]
return asarray(map3d(lambda a: bernoulli(mean), zeros((world_x,world_y,world_z), int)))
agents3d = randarray3d(world_x,world_y,world_z, initial_agents)
agents3d_future = zeros((world_x,world_y,world_z), int)
motion3d_raw = zeros((world_x,world_y,world_z, 3), float)
motion3d_refined = zeros((world_x,world_y,world_z), int)
Офлайн
Обедающий философЕдинственно разумно – одна тема один вопрос.
Не знаю, как принято на настоящем форуме насчёт разделения тем, посему задам их пока что здесь. Вопросы, наверное, глупые.
Офлайн
Пролистал документацию numpy от начала и до конца. Нашёл copy и piecewise. А вот как банально применить функцию ко всему массиву (то бишь не генерируя при этом массив истин) - не нашёл.
Офлайн