我测试了哪种方法更快 - log 或 str - 两者都给出了相似的结果,但 str 快一点。如果您不将str 转换为int,那么它会更快。您也可以使用ord() 代替int() 以使其更快。
e1 = time.time()
results = [int(str(n)[0]) for n in numbers]
e2 = time.time()
print('int(str): {:.10f}'.format(e2-e1))
e1 = time.time()
results = [n//10**int(math.log(n, 10)) for n in numbers]
e2 = time.time()
print(' log: {:.10f}'.format(e2-e1))
e1 = time.time()
results = [str(n)[0] for n in numbers]
e2 = time.time()
print(' str: {:.10f}'.format(e2-e1))
e1 = time.time()
results = [ord(str(n)[0])-ord('0') for n in numbers]
e2 = time.time()
print('ord(str): {:.10f}'.format(e2-e1))
结果
int(str): 0.0000424385
log: 0.0000514984
str: 0.0000197887
ord(str): 0.0000286102
为了进行更好的测试,我使用了模块timeit,它多次运行代码并计算平均时间。
我还使用df.apply() 检查代码并将df 转换为list,然后将list 转换为df。一切都表明,用于获得第一位数字的时间是如此之短,以至于它在所有计算中并不重要
import pandas as pd
import math
import time
import timeit
def test1():
results = [int(str(n)[0]) for n in numbers]
def test1b():
results = [ord(str(n)[0]) - ord('0') for n in numbers]
def test1c():
results = [str(n)[0] for n in numbers]
def test2():
results = [n//10**int(math.log(n, 10)) for n in numbers]
def test3():
df['number'] = df['errorcodes1'].apply(lambda n:int(str(n)[0]))
def test3b():
df['number'] = df['errorcodes1'].apply(lambda n:ord(str(n)[0])-ord('0'))
def test3c():
df['number'] = df['errorcodes1'].apply(lambda n:str(n)[0])
def test4():
df['number'] = df['errorcodes1'].apply(lambda n:n//10**int(math.log(n, 10)))
def test5():
numbers = df['errorcodes1'].to_list()
results = [int(str(n)[0]) for n in numbers]
df['number'] = results
def test6():
numbers = df['errorcodes1'].to_list()
results = [n//10**int(math.log(n, 10)) for n in numbers]
df['number'] = results
df = pd.DataFrame({'errorcodes1':[6321,235,314,421,5346,514,4,3415,136,216,34,623]})
numbers = df['errorcodes1'].to_list()
print('list log() : {:.5f}'.format(timeit.timeit(test2, number=1000)))
print('list int(str()) : {:.5f}'.format(timeit.timeit(test1, number=1000)))
print('list ord(str()) : {:.5f}'.format(timeit.timeit(test1b, number=1000)))
print('list str() : {:.5f}'.format(timeit.timeit(test1c, number=1000)))
print('---')
print('df.apply(log()) : {:.5f}'.format(timeit.timeit(test4, number=1000)))
print('df.apply(int(str())) : {:.5f}'.format(timeit.timeit(test3, number=1000)))
print('df.apply(ord(str())) : {:.5f}'.format(timeit.timeit(test3b, number=1000)))
print('df.apply(str()) : {:.5f}'.format(timeit.timeit(test3c, number=1000)))
print('---')
print('df -> list int(str()) -> df : {:.5f}'.format(timeit.timeit(test5, number=1000)))
print('df -> list log() -> df : {:.5f}'.format(timeit.timeit(test6, number=1000)))
结果:
list log() : 0.01505
list int(str()) : 0.00917
list ord(str()) : 0.00713
list str() : 0.00463
---
df.apply(log()) : 0.62433
df.apply(int(str())) : 0.61940
df.apply(ord(str())) : 0.60435
df.apply(str()) : 0.64205
---
df -> list int(str()) -> df : 0.27188
df -> list log() -> df : 0.27696