TL; DR:
- 入力が主に浮動小数点数に変換できる文字列である場合、この
try: except:
メソッドは最高のネイティブPythonメソッドです。
- 入力がフロートに変換できない文字列である場合は、正規表現またはパーティションメソッドが適しています。
- あなたが1)入力がわからない、またはもっと速度が必要な場合、2)気にしないでサードパーティのC拡張機能をインストールできる場合、fastnumbersは非常にうまく機能します。
fastnumbersと呼ばれるサードパーティのモジュールを介して利用できる別の方法があります(開示、私は作成者です)。isfloatと呼ばれる関数を提供します。この回答でJacob Gabrielsonによって概説されている単体テストの例を取り上げましたが、fastnumbers.isfloat
メソッドを追加しました。Jacobの例は正規表現オプションを正しく実行しなかったことにも注意する必要があります。その例のほとんどの時間は、ドット演算子のためにグローバルルックアップに費やされたためですtry: except:
。
def is_float_try(str):
try:
float(str)
return True
except ValueError:
return False
import re
_float_regexp = re.compile(r"^[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?$").match
def is_float_re(str):
return True if _float_regexp(str) else False
def is_float_partition(element):
partition=element.partition('.')
if (partition[0].isdigit() and partition[1]=='.' and partition[2].isdigit()) or (partition[0]=='' and partition[1]=='.' and partition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
else:
return False
from fastnumbers import isfloat
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re_perf(self):
print
print 're sad:', timeit.Timer('ttest.is_float_re("12.2x")', "import ttest").timeit()
print 're happy:', timeit.Timer('ttest.is_float_re("12.2")', "import ttest").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('ttest.is_float_try("12.2x")', "import ttest").timeit()
print 'try happy:', timeit.Timer('ttest.is_float_try("12.2")', "import ttest").timeit()
def test_fn_perf(self):
print
print 'fn sad:', timeit.Timer('ttest.isfloat("12.2x")', "import ttest").timeit()
print 'fn happy:', timeit.Timer('ttest.isfloat("12.2")', "import ttest").timeit()
def test_part_perf(self):
print
print 'part sad:', timeit.Timer('ttest.is_float_partition("12.2x")', "import ttest").timeit()
print 'part happy:', timeit.Timer('ttest.is_float_partition("12.2")', "import ttest").timeit()
unittest.main()
私のマシンでは、出力は次のとおりです。
fn sad: 0.220988988876
fn happy: 0.212214946747
.
part sad: 1.2219619751
part happy: 0.754667043686
.
re sad: 1.50515985489
re happy: 1.01107215881
.
try sad: 2.40243887901
try happy: 0.425730228424
.
----------------------------------------------------------------------
Ran 4 tests in 7.761s
OK
ご覧のように、正規表現は当初見た目ほど悪くはありませんが、速度が本当に必要な場合は、このfastnumbers
方法は非常に優れています。