Last active
September 11, 2019 09:08
-
-
Save Kento75/2a4490a478dbb19c2d16e8665d7c4d88 to your computer and use it in GitHub Desktop.
【Pythonメモ】モジュールのプロファイリング ref: https://qiita.com/Kento75/items/8b72d64884d7072eece2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ python -m cProfile -s cumulative julia_set.py | |
Length of x: 1000 | |
Total elements: 1000000 | |
calculate_z_serial_purepython took 23.838048934936523 seconds | |
36221995 function calls in 25.485 seconds | |
Ordered by: cumulative time | |
ncalls tottime percall cumtime percall filename:lineno(function) | |
1 0.000 0.000 25.485 25.485 {built-in method builtins.exec} | |
1 0.060 0.060 25.485 25.485 julia_set.py:1(<module>) | |
1 1.270 1.270 25.425 25.425 julia_set.py:8(calc_pure_python) | |
1 16.907 16.907 23.839 23.839 julia_set.py:44(calculate_z_serial_purepython) | |
34219980 6.932 0.000 6.932 0.000 {built-in method builtins.abs} | |
2002000 0.300 0.000 0.300 0.000 {method 'append' of 'list' objects} | |
1 0.015 0.015 0.015 0.015 {built-in method builtins.sum} | |
3 0.001 0.000 0.001 0.000 {built-in method builtins.print} | |
2 0.000 0.000 0.000 0.000 {built-in method time.time} | |
4 0.000 0.000 0.000 0.000 {built-in method builtins.len} | |
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} | |
(以下略) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ python line_profiler/kernprof.py -l -v julia_set.py | |
Length of x: 1000 | |
Total elements: 1000000 | |
calculate_z_serial_purepython took 277.837988615036 seconds | |
Wrote profile results to julia_set.py.lprof | |
Timer unit: 3.9474e-07 s | |
Total time: 173.619 s | |
File: julia_set.py | |
Function: calculate_z_serial_purepython at line 45 | |
Line # Hits Time Per Hit % Time Line Contents | |
============================================================== | |
45 @profile | |
46 def calculate_z_serial_purepython(maxiter, zs, cs): | |
47 """ | |
48 ジュリア漸化式を使用して output リストを計算する | |
49 """ | |
50 1 18915.0 18915.0 0.0 output = [0] * len(zs) | |
51 1000001 2707922.0 2.7 0.6 for i in range(len(zs)): | |
52 1000000 2632718.0 2.6 0.6 n = 0 | |
53 1000000 3088312.0 3.1 0.7 z = zs[i] | |
54 1000000 2982926.0 3.0 0.7 c = cs[i] | |
55 34219980 177968268.0 5.2 40.5 while abs(z) < 2 and n < maxiter: | |
56 33219980 142884632.0 4.3 32.5 z = z * z + c | |
57 33219980 104282683.0 3.1 23.7 n += 1 | |
58 | |
59 1000000 3264717.0 3.3 0.7 output[i] = n | |
60 | |
61 1 5.0 5.0 0.0 return output | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# profile.stats → ファイル名 | |
$ python -m cProfile -o profile.stats julia_set.py |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ python | |
>>> import pstats | |
>>> p = pstats.Stats('profile.stats') | |
>>> p.sort_stats('cumulative') | |
>>> <pstats.Stats object at 0x00000299728D9278> | |
>>> p.print_stats() | |
Mon Jul 16 08:44:00 2018 profile.stats | |
36221995 function calls in 29.504 seconds | |
Ordered by: cumulative time | |
ncalls tottime percall cumtime percall filename:lineno(function) | |
1 0.000 0.000 29.504 29.504 {built-in method builtins.exec} | |
1 0.062 0.062 29.504 29.504 julia_set.py:1(<module>) | |
1 1.272 1.272 29.442 29.442 julia_set.py:8(calc_pure_python) | |
1 19.520 19.520 27.850 27.850 julia_set.py:44(calculate_z_serial_purepython) | |
34219980 8.331 0.000 8.331 0.000 {built-in method builtins.abs} | |
2002000 0.299 0.000 0.299 0.000 {method 'append' of 'list' objects} | |
1 0.021 0.021 0.021 0.021 {built-in method builtins.sum} | |
3 0.001 0.000 0.001 0.000 {built-in method builtins.print} | |
2 0.000 0.000 0.000 0.000 {built-in method time.time} | |
4 0.000 0.000 0.000 0.000 {built-in method builtins.len} | |
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} | |
<pstats.Stats object at 0x000001FA58817588> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> p.print_callers() | |
Ordered by: cumulative time | |
Function was called by... | |
ncalls tottime cumtime | |
{built-in method builtins.exec} <- | |
before_julia_set_1.py:4(<module>) <- 1 0.051 27.094 {built-in method builtins.exec} | |
before_julia_set_1.py:24(calc_pure_python) <- 1 1.218 27.044 before_julia_set_1.py:4(<module>) | |
before_julia_set_1.py:14(measure_time) <- 1 0.000 25.514 before_julia_set_1.py:24(calc_pure_python) | |
before_julia_set_1.py:64(calculate_z_serial_purepython) <- 1 18.297 25.514 before_julia_set_1.py:14(measure_time) | |
{built-in method builtins.abs} <- 34219980 7.217 7.217 before_julia_set_1.py:64(calculate_z_serial_purepython) | |
{method 'append' of 'list' objects} <- 2002000 0.296 0.296 before_julia_set_1.py:24(calc_pure_python) | |
{built-in method builtins.sum} <- 1 0.015 0.015 before_julia_set_1.py:24(calc_pure_python) | |
{built-in method builtins.print} <- 1 0.000 0.000 before_julia_set_1.py:14(measure_time) | |
3 0.000 0.000 before_julia_set_1.py:24(calc_pure_python) | |
before_julia_set_1.py:13(timefn) <- 1 0.000 0.000 before_julia_set_1.py:4(<module>) | |
C:\Users\kento\AppData\Local\Programs\Python\Python36\lib\functools.py:44(update_wrapper) <- 1 0.000 0.000 before_julia_set_1.py:13(timefn) | |
{built-in method time.time} <- 2 0.000 0.000 before_julia_set_1.py:14(measure_time) | |
2 0.000 0.000 before_julia_set_1.py:24(calc_pure_python) | |
<frozen importlib._bootstrap>:997(_handle_fromlist) <- 1 0.000 0.000 before_julia_set_1.py:4(<module>) | |
{built-in method builtins.len} <- 2 0.000 0.000 before_julia_set_1.py:24(calc_pure_python) | |
2 0.000 0.000 before_julia_set_1.py:64(calculate_z_serial_purepython) | |
{built-in method builtins.getattr} <- 7 0.000 0.000 C:\Users\kento\AppData\Local\Programs\Python\Python36\lib\functools.py:44(update_wrap | |
per) | |
以下略 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
>>> p.print_callees() | |
Ordered by: cumulative time | |
Function was called by... | |
ncalls tottime cumtime | |
{built-in method builtins.exec} <- | |
julia_set.py:1(<module>) <- 1 0.062 29.504 {built-in method builtins.exec} | |
julia_set.py:8(calc_pure_python) <- 1 1.272 29.442 julia_set.py:1(<module>) | |
julia_set.py:44(calculate_z_serial_purepython) <- 1 19.520 27.850 julia_set.py:8(calc_pure_python) | |
{built-in method builtins.abs} <- 34219980 8.331 8.331 julia_set.py:44(calculate_z_serial_purepython) | |
{method 'append' of 'list' objects} <- 2002000 0.299 0.299 julia_set.py:8(calc_pure_python) | |
{built-in method builtins.sum} <- 1 0.021 0.021 julia_set.py:8(calc_pure_python) | |
{built-in method builtins.print} <- 3 0.001 0.001 julia_set.py:8(calc_pure_python) | |
{built-in method time.time} <- 2 0.000 0.000 julia_set.py:8(calc_pure_python) | |
{built-in method builtins.len} <- 2 0.000 0.000 julia_set.py:8(calc_pure_python) | |
2 0.000 0.000 julia_set.py:44(calculate_z_serial_purepython) | |
{method 'disable' of '_lsprof.Profiler' objects} <- | |
<pstats.Stats object at 0x000001FA58817588> | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ pip install snakeviz |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# profile.stats → ファイル名 | |
$ snakeviz profile.stats |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# エラーが出るがインストールはできる。 | |
$ pip install line_profiler | |
$ git clone https://github.com/rkern/line_profiler.git |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
# グローバル定数 | |
x1, x2, y1, y2 = -1.8, 1.8, -1.8, 1.8 | |
c_real, c_imag = -0.62772, -0.42193 | |
def calc_pure_python(desired_width, max_iterations): | |
x_step = (float(x2 - x1) / float(desired_width)) | |
y_step = (float(y1 - y2) / float(desired_width)) | |
x = [] | |
y = [] | |
ycoord = y2 | |
while ycoord > y1: | |
y.append(ycoord) | |
ycoord += y_step | |
xcoord = x1 | |
while xcoord < x2: | |
x.append(xcoord) | |
xcoord += x_step | |
# 座標リストを作り、各点を初期条件にする | |
zs = [] | |
cs = [] | |
for ycoord in y: | |
for xcoord in x: | |
zs.append(complex(xcoord, ycoord)) | |
cs.append(complex(c_real, c_imag)) | |
print('Length of x: ', len(x)) | |
print('Total elements: ', len(zs)) | |
start_time = time.time() | |
output = calculate_z_serial_purepython(max_iterations, zs, cs) | |
end_time = time.time() | |
secs = end_time - start_time | |
print(f'{ calculate_z_serial_purepython.__name__ } took { secs } seconds') | |
# 固定値 1000~2のグリッドを、繰り返し上限300回としたときの値 | |
# 正当性チェック | |
assert sum(output) == 33219980 | |
# CPU バウンドの計算関数 | |
# ↓ に @profileを追加して line_profilerの計測対象にする | |
@profile | |
def calculate_z_serial_purepython(maxiter, zs, cs): | |
""" | |
ジュリア漸化式を使用して output リストを計算する | |
""" | |
output = [0] * len(zs) | |
for i in range(len(zs)): | |
n = 0 | |
z = zs[i] | |
c = cs[i] | |
while abs(z) < 2 and n < maxiter: | |
z = z * z + c | |
n += 1 | |
output[i] = n | |
return output | |
if __name__ == '__main__': | |
# ジュリア集合を計算する | |
calc_pure_python(desired_width=1000, max_iterations=300) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment