micropython中处理文本最快的方法

在单片机中, 计算能力资源非常有限, 如何设计出更高执行效率的代码时嵌入式开发者的必修课程, 我通过统计和对比计算出了在micropython中最快的文本处理方法.

实验流程:

分别使用 string.join () , 文本加文本 , % 占位符 , string.format() 这四种方式 (micropython不支持f-string)来生成一段时间文本, 每一种方法执行五次, 每一次生成500次, 计算每种方法花费的时间.

实验脚本:

import time()

print ('method 1: (join)')
for i in range (1,6):
    t = time.ticks_ms ()
    for _ in range (5000):
        y,m,d,_,h,mi,s,_ = rtc.datetime ()
        v = ''.join((str(y),'-',str(m),'-',str(d),' ', str(h),':',str(mi),':',str(s)))
    print (i,' : ',"mt1 took ", round ((time.ticks_ms () - t)/1000,2), 's')

print ('method 2: (+)')
for i in range (1,6):
    t = time.ticks_ms ()
    for _ in range (5000):
        y,m,d,_,h,mi,s,_ = rtc.datetime ()
        # met1: ''.join((str(y),'-',str(m),'-',str(d),' ', str(h),':',str(m),':',str(s)))
        v = (str(y)+'-'+str(m)+'-'+str(d)+' '+ str(h)+':'+str(mi)+':'+str(s))# v = ''.join((str(y),'-',str(m),'-',str(d),' ', str(h),':',str(m),':',str(s)))
    print (i,' : ',"mt2 took ", round ((time.ticks_ms () - t)/1000,2), 's')

print ('method 3: (format % )')
for i in range (1,6):
    t = time.ticks_ms ()
    for _ in range (5000):
        y,m,d,_,h,mi,s,_ = rtc.datetime ()
        # met1: ''.join((str(y),'-',str(m),'-',str(d),' ', str(h),':',str(m),':',str(s)))
        v = "%d-%d-%d %d:%d:%d"%(y,m,d,h,mi,s)
    print (i,' : ',"mt3 took ", round ((time.ticks_ms () - t)/1000,2), 's')


print ('method 4: ( ''.format )')
for i in range (1,6):
    t = time.ticks_ms ()
    for _ in range (5000):
        y,m,d,_,h,mi,s,_ = rtc.datetime ()
        # met1: ''.join((str(y),'-',str(m),'-',str(d),' ', str(h),':',str(m),':',str(s)))
        v = '{0}-{1}-{2} {3}:{4}:{5}'.format (y,m,d,h,mi,s)
    print (i,' : ',"mt3 took ", round ((time.ticks_ms () - t)/1000,2), 's')

实验结果:

花费的时间(数值越小,耗时越少)

这个结果非常地amazing啊, 一开始我以为最快的会是 string.join (), 结果 % format的方式直接秒杀了一众人,直接比最慢的文本相加快了5.5倍之多.

实验结论:

通过上面的实验,我们可以得出排名:

  1. % format
  2. str.join ()
  3. str.format ()
  4. str + str

我们最熟悉且最常用的 str+str 的方式居然是最慢的, 因此以后建议使用 str.join() 作为代替, 如果能够使用 % format 的方式那就最好不过了.

根据我的猜测, 在单片机中内存与CPU的交换速度非常慢, 因此如果能够有效的减少内存操作对计算速度是有非常大的提升的, 在其他的方式中, 传递\复制 了太多的无用内存和指针, 而 % format的方式则直接将数据带入到文本内, 减少了许多无用的内存交换.

在CPython平台的实验

在CPython的实验中, 差距并没有在micropython的实验中那么大,可能因为我的内存是高频内存 (3200MHZ), 亦或是 micropython 和 CPython 对某些功能的实现方法不同.

直接上实验结果

在 CPython 中, 差距并没有达到像micropython那样的五倍之多, 我猜是得益于我高频内存条的影响.

排名:

  1. f-string ≈ % format
  2. str.format ()
  3. str.join ()
  4. str + str

可以看到, 不管在什么平台使用 str+str 的方式都是最差的方式, 如果你一定需要使用这一种方式, 请使用 str.join() 代替它. 令人惊讶的是, 在CPython中, str.format 居然比 str.join 快, 这在micropython中是相反的.

Leave a Reply