39743


今までC++やC#を触っていたのですが、たまにpythonも触っていました。

先日pythonのイテレータを見ていたら、イテレータの終了が`raise StopIteration()`で規定されていて、違和感を感じました。

C#等では「例外のcatchはかなり遅い」というのが常識だと思っていました。  
少なくとも、こういう場面で安易に用いるようなものではないと思います。

もしかして、pythonでは例外処理はそこまで遅くないのでしょうか？高頻度で`raise`しても大丈夫でしょうか？


CC BY-SA 3.0
2017-11-20T13:51:47.867
39712
2017-11-21T18:20:30.257
24033
question
python python3 exception
pythonの例外処理は遅くない？


Pythonの例外はゼロコストではないものの、高価でもない、と言われています。

  * [例外はどれくらい速いのですか？](https://docs.python.org/ja/3/faq/design.html#how-fast-are-exceptions)

> try/except ブロックは例外が送出されなければ極端に効率的です。実際に例外を捕捉するのは高価です。

  * [Cost of exception handlers in Python](https://stackoverflow.com/questions/2522005/cost-of-exception-handlers-in-python)

実際に計測した例。


CC BY-SA 3.0
2017-11-20T23:08:18.353
39718
2017-11-20T23:08:18.353
806
39712
answer


同じ質問が英語の方でありました。  
<https://stackoverflow.com/questions/20115954/would-a-stopiteration-make-
python-slow>

要は `StopIteration` に関してはコストが大きくならないように対処されていて、そのへんはPEP0234で言及されているとのことです。  
<https://www.python.org/dev/peps/pep-0234/>  
Pythonでもほかの例外の捕捉のコストは基本大きいですよ。ドキュメントに書いてあるとおり、

> 実際に例外を捕捉するのは **高価** です。

(※ただし `StopIteration` は除く)  
です。


CC BY-SA 3.0
2017-11-21T15:37:29.477
39743
2017-11-21T18:20:30.257
2017-11-21T18:20:30.257
13227
13227
39712
answer