St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

Julia入門 - Functions(関数)

こんにちは。

Functions (関数)

gist.github.com

Pythonとの違いとか

関数の定義の仕方に微妙な違いはあれ、そんなに大きな違いはありませんでした。引数に値を渡すときにどのように値が渡るかとかも、Pythonと同じみたいですし。

ただ、一点以下の部分が結構びっくりしました。

■operatorを利用した関数

+とか*みたいなoperatorがそのまま関数になるという…詳しくはnotebookを…。

これはめちゃめちゃ便利だなぁと思ったので、積極的に使っていきたいな、と。



今日はこんな感じですね。それでは。

st-hakky.hatenablog.com

Julia入門 - Conditionals(if文/三項演算子)

こんにちは。

今日は、Juliaの条件分岐としてif文を書いていこうと思います。

Conditionals(if文/三項演算子)

gist.github.com

Pythonとの違いとか

■「:」ではなくて、「end」でif文などのbodyを判定する

これは結構Pythonに慣れているとムズムズします笑。

■Short - Circuit Evaluationが便利

notebookを見てもらえれば分かる通り、「&」と「&&」の挙動が違うのですが、その「&&」を利用して行う処理が独特で便利そうだなぁと思いました。

結構使い所ありそうだったので、覚えておきたいと思います。

今日はこんな感じですね。それでは。

st-hakky.hatenablog.com

Julia入門 - Loops (while/for/内包表記)

こんにちは。

今日は、Loop (while/for/内包表記)についてやっていきます。内包表記もついでにやります笑。

Loops (while/for/内包表記)

gist.github.com

Pythonとの違いとか

■コロンはいらない

結構書いていて気持ち悪かったですね、、、笑。コロンの代わりにループのbodyの終了箇所にendを入れることで、ループのbodyの場所を判断しているみたいです。

■多重ループの書き方が特殊

2重ループをPythonでいうところの(書き方は違うけど)1重ループっぽくかけるところが結構違和感ありました。こんな書き方できるんだーという。


その他のところについては、結構Pythonと雰囲気が似ているところがあってわかりやすかったです。ちょっとした違いを吸収すればループ処理は難しくないなと思います。

それでは今日はこんな感じで。

st-hakky.hatenablog.com

Julia入門 - Sets(集合)

こんにちは。今日は、Sets(集合)について勉強していきたいと思います。

Sets(集合)


Pythonとの違いとか

結構似た印象を感じました。定義の仕方とか集合の操作方法に違いはありますが、基本的には同じような感じで使えるな、と。

それでは。

st-hakky.hatenablog.com

Julia入門 - 辞書型 (Dictionaries)

こんにちは。

今日は、辞書型についてやっていきます。

辞書型 (Dictionaries)

gist.github.com

Pythonとの違いとか

違いはあるといえばあるんですが、今回はだいぶ違う感じの印象を受けたので(定義の仕方から違うなど)、私個人としてはJulia言語として受け取ってしまえばいいのかなと思いました(まぁJuliaやっているから当たり前なんですけど笑)



st-hakky.hatenablog.com

Julia入門 - Arrays (配列)

こんにちは。

今日は、配列について書きたいと思います。

Arrays (配列)

gist.github.com

Pythonとの違いとか

まだ勉強しきれてないからかもしれないが、なんかNumpyを使っている雰囲気に近いので、違和感とかは少なかった。

■Juliaは配列の指定とかが1スタート

indexのスタートが0ではなくて、1スタート。Pythonは0スタートなので、地味にミスってイライラする。笑

■デフォルトで用意されている関数が多い(と思う)

Pythonだと、Numpyとかを使わないとできないことが、Juliaだと標準で用意されていることが多い印象を受けた。とても便利。

それでは。


st-hakky.hatenablog.com

Julia入門 - Tuples (タプル)

こんにちは。

今日は、みんな大好き(?)Tupleについてです。JuliaでのTupleの基本についても書くんですが、Pythonではcollectionsモジュールで使えるNamedTupleがめちゃめちゃ便利なので、Juliaではそこら辺どうやってやるのかも書こうと思います。

Tuples (タプル)

gist.github.com

Pythonとの違いとか

tuple([1,2,3])の挙動が違う

Pythonだと、リストの要素一つ一つがtupleの一つ一つの要素として変換されますが、Juliaだとリストがtupleの要素の1つになりました。これは注意が必要だなと。

■NamedTupleを使うにはパッケージのインストールが必要(?)

Pythonでは標準でcollectionsモジュールがるので、そいつを使えばいいですが、Juliaだと、NamedTupleを使うには、パッケージをインストールする必要がありました(あんまり詳しくはないので、間違えてるかもですが)


それでは。


st-hakky.hatenablog.com

Julia入門 - Tutorialを学びながら作ったのでまとめていく【随時更新】

こんにちは。

今年の目標の一つに「Juliaを使えるようになって、データサイエンスをJuliaでする」というものがあるので、いろんなサイトとか見て自分で基本を勉強しながらTutorialを作ってみることにしました。

これはまとめページです。

ちなみに、Julia初心者が勉強しながらやっているので、間違いとかあればコメントとかで教えてもらえると泣いて喜びます…。

参考サイトまとめ

st-hakky.hatenablog.com

JuliaでData Scienceしてみる

Juliaを用いて、普段PythonとかでやっているData分析をやってみようかなと思います。どんなネタがいいかなぁと考え中。



随時更新していきます。

それでは。

*1:Pythonとの違いはぶっちゃけ結構内容薄いので(汗)、Python知らなくてもいけます笑

Julia入門 - Strings

こんにちは。

今日は、JuliaのString型について書きます。勉強していく中で、Pythonとは少し違う部分があるんだなぁと思ったので、そのあたりを中心にまとめます*1

String型

以下のJupyter Notebookにやったこととか書き方とかまとめてます。

gist.github.com

Pythonとの違い

自分がPythonを結構使っているのもあり、比較しながらやるとわかりやすいので、主にPythonとの違いを書きます。

■シングルクオーテーションはcharacter型として扱われる

Pythonだと、シングル/ダブルクオーテーションはそれぞれ、文字列型として扱われますが、Juliaはそうではないみたいです。

文字列型にしようと思ったら、ダブルクオーテーションを使う必要があります。

■文字列の連結には、アスタリスクを使う

Pythonだと「+」で文字列の連結はできますし、「*」で文字列の繰り返し表現を獲得できます。

ですが、Juliaでは「+」では文字列の連結ができず、「*」で文字列の連結ができます。

もちろん、上のコードで示しているとおり、違うやり方もありますが、これはPythonから写ってきた人にとっては結構ハマりポイントかと。

*1:※この記事は、本家のサイトなどをもとにテーマ別に私個人がまとめたものです。詳細などはJulia公式が詳しく、正確です。

Julia入門 - Hello World / コメント / 基本的な算術演算

こんにちは。

Julia入門をしています。今日はお決まりの、Hello Worldあたりを攻めていこうと思います*1

環境構築

以下でやりました。

st-hakky.hatenablog.com

Hello World

以下のような感じですね。

gist.github.com

少しだけコードの補足を以下に書きます。

■出力

Pythonでは、基本的に出力をするときに print()とするだけですが、Juliaではprintln()とするみたいです。

■コメントの書き方

コメントの書き方も基本的にはPythonと同じですが、Pythonと違って複数行のコメントの書き方の方法があるので、便利です。

■基本的な算術演算

ここはPythonとほぼおんなじですが、微妙に違いますね。

今日はこんな感じで終わります。


st-hakky.hatenablog.com

*1:この記事は、本家のサイトなどをもとにテーマ別に私個人がまとめたものです。詳細などはJulia公式が詳しく、正確です。

【Python】functools.partial()で関数やメソッドの引数の一部を固定する部分適用を行う

こんにちは。

最近、化粧のやり方とかを紹介するYoutuberを見て、「へぇー綺麗にできるもんだなぁ」って感心している私ですが、今日はfunctools.partial()の綺麗な使い方を見つけたので、その紹介をメモがてらしようと思います。

関数やメソッドの引数の一部を固定させておきたい気持ちがある

関数やメソッドの引数の一部を固定させて、可変な引数のみを与えることができる新しい関数を作りたい時があります(たぶん)。

例えば、map関数で使う関数の一部の引数を固定させておきたい場合とかがそうです。

from functools import partial

def add_func(a, b):
    return a + b

add_list = list(map(partial(add_func, b=5), [0,1,2,3,4,5]))

print(add_list)

他にも色々例はあると思いますが、以下の例がとてもしっくりきました。

参考になる使い方

SVDっていう手法を使って欠損値補完をするアルゴリズムを書いていた時に調べ物をしていて見つけたコードの中にこんなものがありました。

import numpy as np
from scipy.sparse.linalg import svds
from functools import partial

if k is None:
    svdmethod = partial(np.linalg.svd, full_matrices=False)
else:
    svdmethod = partial(svds, k=k)


これを見た時に、「あっ、こうやって使うと便利やなー」と初めてちゃんとした*1functools.partial()の使い方にあった気持ちになりました。

この関数では kの値に応じて関数の引数の一部を固定し、なおかつ違う関数であるものをまとめてラッパーを作っています。

こうすることで、kの条件によって、異なる引数の指定の仕方をするnp.linalg.svdsvdsを一つの関数にまとめ、その後の処理を svdmethodで行えるようにしています。

これは凄い便利ですね。

functools.partial()の使い方

例で挙げたとおりなんですけど、

new_wrapper_func = functools.partial(func, parameter=value)

みたいな感じで、第一引数にベースとなる関数、第二引数以降に固定したい引数を指定することで使うことができます。

固定したい引数が2つ以上ある場合も、以下みたく指定することができます。

from functools import partial

def add_func(a, b, c):
    return a + b + c

add_list = list(map(partial(add_func, b=5, c=3), [0,1,2,3,4,5]))

print(add_list)


使い方自体はそんなに難しくないですね。それでは。

*1:今までちゃんと使っていなかっただけともいえる

Julia入門 - 入門者がまず読むべき参考サイトや本のまとめ【随時更新】

こんにちは。

Pythonはある程度かけるが、Juliaに関しては全くの初心者である私がこれからJuliaでデータサイエンスをしたり、Deep Learningをしたりしようと思っているので、その学んだ過程とかで参考になった資料とかをまとめておこうかと思います*1

Juliaは、まだPythonとかに比べてまだコミュニティのレベルとして大きくないせいもあってか、日本語の情報とかはやっぱり少なめですが、ことデータサイエンスの文脈で言えば、Pythonよりも実行速度が早く(C並)、動的プログラミング言語という性質が自分的にはかなり気になっているので、今後に期待って感じで、勉強していこうと思います。

自分も勉強になったこととかは、このブログで発信していこうかなーと思っています。

Video

The Julia Language | YouTube Channel

あまり詳しいことはわかってないんですが、おそらくJuliaのコミュニティが運営しているYoutube Channelがあります。以下がそのChannelです。

www.youtube.com

このChannelでは、Juliaに関する情報(JuliaConの様子とかTutorialとか)を流してくれているので、参考になります。

Introduction to Julia

あんまり詳しくはしらないですが、Juliaのコミュニティが「JuliaBox」の中に用意されているTutorialのJupyter Notebookに沿ってチュートリアルをしてくれています。その動画が以下です。

www.youtube.com

Pythonとかをある程度やっていた人は、この動画をみるだけでJuliaの雰囲気はつかめるようになるので、まずはこの動画を見るのがおすすめかなって感じです。

Books

Juliaデータサイエンス―Juliaを使って自分でゼロから作るデータサイエンス世界の探索

私はまだ読んでないですが、以下の本が販売されています。ある程度Juliaの基本をさらってそこそこの機械学習とかをできるようになったら読んでみようかなと。

書評は以下に書かれていました。


また勉強しながら情報を追加していこうと思います。それでは。

*1:そのため、まだ読んだこととか目を通しきれてない資料もここに乗ってます

論文を読んでブログにまとめていこうと思うので、そのまとめ方をまとめておく

こんにちは。

今日はタイトルの件について書きます*1

モチベーション

これまでは、メモ程度でまとめていたり、発表資料(PPT)とかブログでガッツリまとめて公開したり、さらっとメモをブログの下書き機能で書いたりみたいな感じで*2、全然統一感なくまとめていたのですが、これからはちょっと整理してまとめようと思います(遅い笑)。


理由は、特定の分野の論文をどかーっと読んでいくと、なんかちゃんとまとめてないと、結局後戻りがでてくるからです(論文を読み返すみたいな)。多分、論文を大量に読んでいくときに割りとメジャーな論文の管理の方法として、Mendeleyみたいなのがあると思うのですが、自分には全然あっておらず…(白目)


なので、ブログにまとめていたんですが、記事として公開しようとするとその論文についてガリガリ書くか、テーマ別にまとめるかになってしまい、結果としてそんなに書いている時間的余裕もないので、大量に下書きに保存される謎のデータの塊になりやすくなっていました…。


春休みに時間が結構あるので、論文をたくさん読もうかなぁと思ったのもあり、今回どうやってまとめようかなというのを改めて考えました。

解決策:arXivTimesっぽいものを自分のブログでやる

個人的意見ですが、arXivTimesというのが論文のまとめ方としては最適解なのではないかなと思います。

github.com

これは論文のまとめをissueベースで管理するものなのですが、

  • Tagで分野を管理
  • issueで論文のアブストをまとめる

ってことを基本的にしています。自分は勉強したことはブログに書いておく癖がついちゃっているというのと、出来る限り1つの場所にメモはまとめておきたいというのがあるので、これと似たようなことをブログでやることにしました(ブログでもできますし)。

フォーマットは以下のような感じで行こうと思います。これについては、arXivTimesをベースにして、こちらの資料を見つつ、自分なりに作りました。

** 論文関係の資料

** ひとことまとめ

** 先行研究

** 新規性

** 手法の主な点

** 結果

** 議論・発展しそうな方向

** 理解を促す参考資料

** 次に読む論文

これだと、分量が多くても少なくても一通り論文の主張がかけるので、これで行こうかなと思います。

それでは、今日はこんな感じで。

*1:これ書いているときにちょうど研究室のslackで似たネタが出てたので、パクりと思われたらどうしようと思うけど僕が先なので気にしない笑

*2:下書き機能の使い方多分間違っている…

【Python】ピアソンの相関係数をいろいろな方法で計算する方法まとめ(SciPy / Numpy / Pandas)

こんにちは。

今日は題名の通り。

色んな所で目にするピアソンの相関係数ですが、毎回実装の方法調べちゃうので、ピアソンの相関係数をいろんな方法で計算する方法をまとめておきたいと思います。

Pearsonの(積率)相関係数とは

ピアソンの相関係数は、英語ではPearson's correlation coefficientと呼びます。相関係数にもいろいろな種類があって、ピアソンの相関係数もそのうちの一つです。

定義

以下の式で表され、-1~1の値の間で値が変化します。

$$
\frac{ \sum_{i=1}^{n} ( x_{i} - \overline{x} ) ( y_{i} - \overline{y}) }{ \sqrt{ \sum_{i=1}^{n} ( x_{i} - \overline{x})^2 } \sqrt{ \sum_{i=1}^{n} ( y_{i} - \overline{y})^2 } }
$$

使い所

変数間の直線関係の強度を知りたいときにこの相関係数を使用します。定義の式を見ると、 $x$ からその平均 $\overline{x}$ を引いたものと、 $y$ からその平均
$\overline{y}$ を引いたものの $cos$ を表していることになります。よって、「データにおいて、$x$と$y$のばらつきぐあいが完全に一致していたら、相関係数が1になる」ことがわかります。

また、ピアソンの相関係数では、変数が正規分布に従っていることを仮定しています。なので、正規分布に従っていると仮定できるデータがあったとして、そのデータの直線関係の強度を知りたい時、これは使えます。

相関係数の値と相関の強さの関係

以下のように考えるのが目安らしいです。絶対値としているので、負の相関と正の相関の両方を一度に表していますが、相関の強さという意味では変わらないので、略します。

相関係数の絶対値 強さ
0.0~0.2 相関無し
0.2~0.4 やや相関有り
0.4~0.7 強い相関がある
0.7~1.0 非常に強い相関がある

Pythonによる実装

とまぁこんな感じで定義されるピアソンの相関係数ですが、定義自体は難しくないのです。

計算方法がいくつかPythonでは用意されているので、その計算方法を思いつくものをまとめておこうと思います。

scratch

スクラッチといっても、numpy使っちゃってますが、以下のようにかけます。SciPyの方でもソースコードを見たら同じような実装をしていました。

import numpy as np

def pearson_corr(x, y):
    x_diff = x - np.mean(x)
    y_diff = y - np.mean(y)
    return np.dot(x_diff, y_diff) / (np.sqrt(sum(x_diff ** 2)) * np.sqrt(sum(y_diff ** 2)))

SciPy : scipy.spatial.distance

scipyを使った例も書いておきます。

from scipy.spatial.distance import correlation
1 - correlation(x, y)

SciPyを使った場合の注意点として、この関数では以下の式をもとに計算されているので、1から引いてあげないと相関係数が計算できないことです。

$$
1 - \frac{ \sum_{i=1}^{n} ( x_{i} - \overline{x} ) ( y_{i} - \overline{y}) }{ \sqrt{ \sum_{i=1}^{n} ( x_{i} - \overline{x})^2 } \sqrt{ \sum_{i=1}^{n} ( y_{i} - \overline{y})^2 } }
$$

そこさえ注意すれば、特に難しくないかなと思います。

SciPy : scipy.stats.pearsonr

これは、ピアソンの相関係数だけではなく、帰無仮説(無相関)と設定した場合のp値も計算してくれるっぽいです。すばらしいですね。

from scipy.stats import pearsonr
pearsonr(x, y)

例えば上のコードを実行すると、次のような感じのtupleでデータが帰ってきます。

# (ピアソンの相関係数, p値)
(1.0, 0.0)

Numpy : numpy.corrcoef

先程までのscratchで書いたものやSciPyはいずれも1d-arrayを想定していたわけですが、ここでは、2次元配列における行同士の相関も計算することができます。

まず、これまで通り1次元の配列 $x$ と $y$ を入れて計算すると以下のようになります。

import numpy as np
np.corrcoef(x, y, rowvar=True)

ここでパラメーターとして指定している rowvarは、デフォルトでTrueなので、ここでは特に意味は無いです。が、行を変数として扱うのがデフォルトなので、それを反転したいときはここをFalseにするとできます。

この時、出力は、

# 以下のように、変数同士でそれぞれ相関係数を出している。
# array([[ xx    , xy ],
#            [ yx   , yy ]])
array([[ 1.        ,  0.77658027],
       [ 0.77658027,  1.        ]])

みたいな感じで出てきます。なので、通常の相関係数が欲しい場合は、行列の要素として、[0, 1]の部分を取って来ればいいです([1, 0]は事実上同じなので)。

2次元配列でその行(または列)同士の相関を見たい場合は、入力として $y$ を削ってあげればいいだけです。

Pandas : corrメソッド

PandasのDataFrameに、corrのメソッドが存在して、以下のように計算できます。

import pandas as pd
data = pd.DataFrame({"x":[1,2,3,4,5],
                     "y":[-1, -3, -5, 0, 8]})
data.corr()

ちなみに、このメソッドは他にもいろんな相関係数(スピアマンなど)を計算できて、methodパラメーターで指定することで計算できますが、デフォルトではピアソンの相関係数になっているので、特に気にすることはありません。

■参考


こんなくらいでしょうか。他にもあったり、ミスってたら教えてください。

それでは。

【Python】実行時間を測定する方法まとめ

こんにちは。

実行時間(処理時間)を計測したいことはよくあると思いますが、今回はPythonで実行時間を測りたいなってなった時の方法を、自分用にまとめておきたいと思います。

※なんか章立ての粒度がばらばらになってしまった気がするが、細かいことは気にしない。。。

Pythonコード上

Pythonのコード上(という表現がいいのかはわかりませんが汗)で実行時間を計測するための方法が以下。

timeモジュールを使う

これが一番最初にパッと思いつく方法かなと思います。

import time

start = time.time()
func()
process_time = time.time() - start

print(process_time)

デコレーターを用いる方法

こちらの記事で紹介されていたんですが、これは確かに便利だなと思いました(作者の方ありがとうございます)。

自作のデコレーターを作って、それで処理時間を計測したい関数にそのデコレーターを使ってあげれば、実現することが可能です。

以下のコードは、その記事にあったものほぼそのままです(詳細な解説は、元記事にされているので、そちらを参照ください)。

from functools import wraps
import time
def stop_watch(func) :
    @wraps(func)
    def wrapper(*args, **kargs) :
        start = time.time()
        result = func(*args,**kargs)
        process_time =  time.time() - start
        print(f"{func.__name__}は{process_time}秒かかりました")
        return result
    return wrapper

使う時は、処理時間を計測したい関数に、以下のようにしてデコレートしてあげればオッケーです。

@stop_watch
def func() :
    ~~何かの処理を書く~~~

# 使う時は普通に使うだけ。
func()

ただ、私はやっていないのですが、こちらの記事によると、再帰呼び出しや複数関数を同時に計測しようとすると、ハマるらしいので、注意が必要とのことです。

Jupyter Notebook

Jupyter Notebookで実行時間を計測するためには、Pythonファイル上でごねごねやっていた方法を取る必要がなく、簡単に処理時間を計測することができます。

%%timeit

Jupyter Notebookを使っている場合は、簡単に処理時間を計測できるtimeitマジックがあります。

使い方は、%%timeitを実行時間を計測したい処理が書かれているcellにいれるだけです。

%%timeit
func()

そうすると、その処理を何回か繰り返して、処理時間を計測してくれます。以下のような感じの出力が返ってきます。

The slowest run took 7.18 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 7.56 µs per loop

10万回も実行して、処理時間に関する情報をくれています。実際に何回か実行するとわかるんですが、一回一回の実行では処理時間に結構ばらつきがありますので、より正確に実行時間を知りたい場合にはこちらを使うといいかな、っておもいます。

%%time

%%timeでも処理時間を計測できます。

%%time
func()

こうすると、以下のような出力が返ってきます。

CPU times: user 5 µs, sys: 0 ns, total: 5 µs
Wall time: 10 µs

CPU timesってのが何なのかはいまいちよくわかっていませんが*1、とりあえず、Wall timeってのが実行時間のことなので、これで処理にかかった時間をしれます。

さっきの%%timeitは、10万回も実行していましたが、今回は1回の実行時間しか計測していません。ので、実行時間にはばらつきはでますが、だいたいの処理時間を知りたい時には便利かなと思います。

IPython

%timeit

IPythonでは、1行でかける場合に限定されてしまうっぽいのですが、以下のようにかけます。%timeitの意味は、Jupyter で説明したのと同じく、複数回実行して処理時間を返してくれます。

%timeit func()

これも関数の実行時間とか知る分には充分ですよね。

%time

当然、%timeも用意されていて、これもJupyterで説明したのと同じ意味で使われます。

使い方は、以下の通りです。

%time func()

コマンドライン

Linuxのtimeコマンドを利用する

script全体の時間を計りたい時に使うと便利なのが、これです。以下のようにすることで、script全体の実行時間を計測することができます。

$ time python file.py

timeitを使用して実行時間を測る

以下のような方法でも処理時間を測ることができます。

$ python -m timeit "[i for i in range(100)]"
100000 loops, best of 3: 4.88 usec per loop

デフォルトでは10万回処理時間を計測してくれるみたいです(やりすぎでは笑)。これは内包表記の時間を計っていますが、ファイル中の処理の実行時間も計測できて、

$ python -m timeit -s "import file_name" "file_name.func_name()"

みたいな感じでできます。-sは、その後の処理を一度だけ実行するということを指定できるやつです。これしないと、10万回回す必要がないものまで回ってしまうので、危険です。

cProfile

Pythonには、cProfileというものがあります。詳細はドキュメントをみればわかりますが、一応まとめておこうかなと思います。

# -s をつけることで、実行時間をソートして出力を返してくれる
python -m cProfile -s file_name.py

# 更にcumulative をつけることで、関数が消費した累計時間でソートして、表示してくれます
python -m cProfile -s cumulative file_name.py

コマンドライン以外からでも使うことができますが、詳細はドキュメントを。

cProfileの使い所

例えばscript内で複数の関数を使用して処理を実行する際に、「何がボトルネックになっているか」を特定するのに使うと良いそうです。

このcProfileでは、複数の関数が何回呼び出されたかや、その処理にかかった時間を返してくれるので、どこの処理にどれくらいの時間がかかっているかがわかります。

処理の時間を計測してパフォーマンスを改善したい場合がほとんどだと思うので、これは便利ですね。

出力結果の見方

出力がちょっと特殊なので、ドキュメントに書いてある通りですが、メモがわりに記載しておきます。

ncalls 呼び出し回数
tottime 与えられた関数に消費された合計時間 (sub-function の呼び出しで消費された時間は除外されています)
percall tottime を ncalls で割った値
cumtime この関数と全ての subfunction に消費された累積時間 (起動から終了まで)。この数字は再帰関数に ついても 正確です。
percall cumtime をプリミティブな呼び出し回数で割った値
filename:lineno(function) その関数のファイル名、行番号、関数名
■参考


こんな感じでしょうか。。。他に方法を知っている方がいれば教えてください。

それでは。

*1:わかる方だれか教えてください