2016-12-01 14 views
1

Pythonでは、名前付きタプルの宣言に文字列のシーケンスとして、または各名前が空白やコンマで区切られた単一の文字列として、field_namesを指定することができます。名前付きタプルフィールド名:単一の文字列またはシーケンス?

FIELD_NAMESは、[「X」、「Y」]のように文字列の配列で:

公式ドキュメントによると、Python 2で優先的な方法は、シーケンスとして名を提供することだったようです。 また、field_namesには、各フィールド名が の空白またはコンマで区切られた単一の文字列(たとえば 'x y'または 'x、y')を使用できます。

Python 3に嗜好が単一のストリングバージョンに変更しつつ:

FIELD_NAMESは 空白および/またはコンマで区切られた各フィールド名を持つ単一の文字列は、例えば「X-Y」又は「Xため、 y 'である。 また、field_namesは、['x'、 'y']のような一連の文字列にすることができます。

理由はありますか?

一見すると、入力を分割する必要があるため、単一文字列バージョンの方が効率が悪いと言えます。シーケンスは、私にとっても読みやすいようです。どれが効率的ですか?

+1

通常、名前付きタプルの種類は起動時に一度作成されるため、ここで効率を上げてはいけません。最も読みやすいと思われるものを使用してください。 – zstewart

+0

@zstewart:なぜ、彼らはPython 3の文書で言い換えて時間を費やしたのですか? – Pintun

+0

おそらく彼らはそれがもっと読みやすいと思ったのでしょうか、あるいは意図的な決定ではなかったかもしれません、私は分かりません。しかし、namedtupleは通常、 'class'に類似したトップレベルの単一実行型宣言として使用されるので、この文字列解析の効率はかなり無関係です。 – zstewart

答えて

2

はい、strを提供することがstr秒、see sourceにその内容をマッピングする前.replace.splitが含まれます。

if isinstance(field_names, str): 
    field_names = field_names.replace(',', ' ').split() 
field_names = list(map(str, field_names)) 

これは明らかにあなたがリストを供給した場合よりも少し時間がかかります。しかし、は決してのパフォーマンスボトルネックになるはずですが、クラスを生成するnamedtupleへの最初の呼び出し中にのみ実行されます。必然的な呼び出しは何もする必要はありません。要するに、ここでのパフォーマンスについては心配しないでください。

+0

しかし、なぜ彼らは言い換えたのですか?その背後には理由があるはずです。言い換えれば、編集者は単なるストリング・バージョンの "pythonic"を考慮しているからです。これは、関数呼び出しでリストのネストされた構造を避けるためです。 – Pintun

+0

これに関するバグトラッカーに関する特定の問題を見つけることができないようです。私はそれにつながった何らかの理由(パフォーマンスのようなもの)が変わったとは思っていません。それは個人的な好み(いくつかの人がこのレベルでやるように)に落ちるかもしれません。 @Pintun –

+2

歴史的な見解はちょっと驚くべきことですが、Python 2.6では["single string" version](http://svn.python.org/view/doctools/trunk/Doc-26/library/collections.rst?revision = 56662&view = markup&pathrev = 57058#l371)そして、「マイナーな文書のクリーンアップ」(https://github.com/python/cpython/commit/7be6326e09f2062315f995a18ab54baedfd0c0ff)はPython 2のためだけに順序を変更しました。 – wrwrwr

関連する問題