Jika Anda peduli dengan kinerja (dan saya tidak menyarankan Anda seharusnya), pendekatan berbasis coba adalah pemenang yang jelas (dibandingkan dengan pendekatan berbasis partisi atau pendekatan regexp), selama Anda tidak mengharapkan banyak string tidak valid, dalam hal ini berpotensi lebih lambat (mungkin karena biaya penanganan pengecualian).
Sekali lagi, saya tidak menyarankan Anda peduli dengan kinerja, hanya memberi Anda data jika Anda melakukan ini 10 miliar kali per detik, atau sesuatu. Juga, kode berbasis partisi tidak menangani setidaknya satu string yang valid.
$ ./floatstr.py
F ..
partisi sedih: 3.1102449894
partisi senang: 2.09208488464
..
sedih: 7.76906108856
kembali bahagia: 7.09421992302
..
coba sedih: 12.1525540352
coba bahagia: 1.44165301323
.
================================================== ====================
GAGAL: test_partition (__main __. ConvertTests)
-------------------------------------------------- --------------------
Traceback (panggilan terakhir terakhir):
File "./floatstr.py", baris 48, di test_partition
self.failUnless (is_float_partition ("20e2"))
AssertionError
-------------------------------------------------- --------------------
Berlari 8 tes dalam 33,670-an
GAGAL (kegagalan = 1)
Berikut kodenya (Python 2.6, regexp diambil dari jawaban John Gietzen ):
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)?$")
def is_float_re(str):
return re.match(_float_regexp, str)
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 pa\
rtition[2].isdigit()) or (partition[0].isdigit() and partition[1]=='.' and partition[2]==''):
return True
if __name__ == '__main__':
import unittest
import timeit
class ConvertTests(unittest.TestCase):
def test_re(self):
self.failUnless(is_float_re("20e2"))
def test_try(self):
self.failUnless(is_float_try("20e2"))
def test_re_perf(self):
print
print 're sad:', timeit.Timer('floatstr.is_float_re("12.2x")', "import floatstr").timeit()
print 're happy:', timeit.Timer('floatstr.is_float_re("12.2")', "import floatstr").timeit()
def test_try_perf(self):
print
print 'try sad:', timeit.Timer('floatstr.is_float_try("12.2x")', "import floatstr").timeit()
print 'try happy:', timeit.Timer('floatstr.is_float_try("12.2")', "import floatstr").timeit()
def test_partition_perf(self):
print
print 'partition sad:', timeit.Timer('floatstr.is_float_partition("12.2x")', "import floatstr").timeit()
print 'partition happy:', timeit.Timer('floatstr.is_float_partition("12.2")', "import floatstr").timeit()
def test_partition(self):
self.failUnless(is_float_partition("20e2"))
def test_partition2(self):
self.failUnless(is_float_partition(".2"))
def test_partition3(self):
self.failIf(is_float_partition("1234x.2"))
unittest.main()