micropython程序容量_micropython程序优化实例

这个优化例子来自 Damien在 pycomau 上的演讲使用MicroPython高效快速编程,演讲视频大家可以在前几天的订阅号中查看。

首先我们看下面的程序,它在循环中翻转LED,然后通过运行的时间和翻转次数,计算出每秒翻转的频率。

frommachineimportPin

importtime

led=Pin('A13')

N=200000

t0=time.ticks_us()

foriinrange(N):

led.on()

led.off()

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/N,N/dt*1e3))

我们将这段代码保存为文件led1.py,然后import led1执行。在pybv10或者pyboardCN上结果是:

3.381sec,16.905usec/blink:59.16kblink/sec

在MicroPython程序优化原则中,提到尽量在程序中执行功能,不要在主程序中运行,因此可以将LED翻转放在函数中执行。

frommachineimportPin

importtime

led=Pin('A13')

N=200000

defblink_simple(n):

foriinrange(n):

led.on()

led.off()

deftime_it(f,n):

t0=time.ticks_us()

f(n)

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/n,n/dt*1e3))

time_it(blink_simple,N)

运行后的结果是:

2.902 sec, 14.509 usec/blink :    68.92 kblink/sec

可以看到,我们没有做什么实质的改到,就明显提高了速度。

循环是最消耗运行时间的,我们对循环中led.on()和led.off()两个动作进行优化,将它们预先载入内存,而无需循环中每次载入。

frommachineimportPin

importtime

led=Pin('A13')

N=200000

defblink_simple(n):

on=led.on

off=led.off

foriinrange(n):

on()

off()

deftime_it(f,n):

t0=time.ticks_us()

f(n)

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/n,n/dt*1e3))

time_it(blink_simple,N)

优化后结果是

1.617 sec,  8.086 usec/blink :   123.68 kblink/sec

提高了将近一倍。

进一步将循环中对 range(n) 也进行优化

frommachineimportPin

importtime

led=Pin('A13')

N=200000

defblink_simple(n):

on=led.on

off=led.off

r=range(n)

foriinr:

on()

off()

deftime_it(f,n):

t0=time.ticks_us()

f(n)

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/n,n/dt*1e3))

time_it(blink_simple,N)

运行结果是

1.121 sec,  5.607 usec/blink :   178.35 kblink/sec

再次提升了性能。

进一步对循环中的操作优化,减少循环次数

frommachineimportPin

importtime

led=Pin('A13')

N=200000

defblink_simple(n):

n//=8

on=led.on

off=led.off

r=range(n)

foriinr:

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

deftime_it(f,n):

t0=time.ticks_us()

f(n)

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/n,n/dt*1e3))

time_it(blink_simple,N)

速度又有明显提升。

0.913 sec,  4.563 usec/blink :   219.16 kblink/sec

根据MicroPython的优化功能,可以将程序声明为native code(本地代码),它使用CPU的操作码(opcode),而不是字节码(bytecode)

frommachineimportPin

importtime

led=Pin('A13')

N=200000

@micropython.native

defblink_simple(n):

n//=8

on=led.on

off=led.off

r=range(n)

foriinr:

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

on()

off()

deftime_it(f,n):

t0=time.ticks_us()

f(n)

t1=time.ticks_us()

dt=time.ticks_diff(t1,t0)

fmt='{:5.3f} sec, {:6.3f} usec/blink : {:8.2f} kblink/sec'

print(fmt.format(dt*1e-6,dt/n,n/dt*1e3))

time_it(blink_simple,N)

测试结果:

0.704 sec,  3.521 usec/blink :   284.00 kblink/sec

程序还可以进一步优化,完整内容请参看下方的阅读原文,获取终极优化的方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: microPython是一种精简版的Python编程语言,可以在微控制器和嵌入式系统中使用。DHT11是一种温湿度传感器,通常用于测量环境温度和湿度。 要编写microPython的DHT11驱动程序,可以使用以下步骤: 1. 首先,需要连接DHT11传感器到微控制器或开发板的GPIO引脚上。具体连接方式可以参考传感器的数据手册或者开发板的引脚图。 2. 然后,需要在microPython中导入相应的库文件,例如dht库,来实现对DHT11传感器的控制和读取。 3. 接着,可以定义一个函数来读取DHT11传感器的温湿度值。例如,可以定义一个名为read_dht11的函数,该函数使用dht库中的DHT11类来实例化一个DHT11对象,并使用该对象的read()方法读取温湿度值。 4. 最后,可以在主程序中调用该函数,并将读取的温湿度值输出到终端或其他设备上,例如OLED显示屏或串口调试器。 下面是一个示例代码,展示如何使用microPython编写DHT11驱动程序: ```python import dht import machine import time d = dht.DHT11(machine.Pin(4)) def read_dht11(): d.measure() temp = d.temperature() hum = d.humidity() return temp, hum while True: temp, hum = read_dht11() print('Temperature: %d°C, Humidity: %d%%' % (temp, hum)) time.sleep(2) ``` 在上述示例代码中,我们导入了dht和machine库,其中dht库提供了DHT11类,用于实现对DHT11传感器的控制和读取。我们还定义了一个read_dht11函数,用于读取温湿度值,并将其返回。最后,在主程序中调用该函数,并使用print语句将温湿度值输出到终端上。程序会每隔2秒钟读取一次温湿度值,并不断输出到终端上。 ### 回答2: microPython是一种小型Python解释器,专为嵌入式系统开发而设计。它可以运行在各种微控制器平台上,如ESP8266和Arduino等。DHT11是一种数字温湿度传感器,常用于测量环境中的温度和湿度。 microPython DHT11驱动程序是用于与DHT11传感器通信和获取数据的代码。它实现了与DHT11传感器的协议通信,并解析传感器返回的数据,提供温度和湿度的值。 在编写microPython DHT11驱动程序时,首先需要配置传感器的引脚。传感器的数据引脚(DATA)连接到单片机的一个GPIO引脚上。然后,在驱动程序中,使用GPIO库来控制引脚状态,实现与传感器的通信。 通常,与DHT11传感器通信的协议是一种单线串行协议。驱动程序需要发送一个起始信号给传感器,等待传感器的响应。一旦传感器响应,驱动程序将接收传感器发送的数据,并进行解析。 解析传感器数据的过程有点复杂。传感器返回的数据是40位二进制编码,其中包括湿度、温度和校验位等信息。驱动程序需要按照一定的规则解析二进制编码,提取出温度和湿度的数值,并进行校验。 最后,驱动程序将提供温度和湿度的数值作为函数的返回值,以供其他程序使用。 总之,microPython DHT11驱动程序是用于与DHT11传感器通信和获取温度湿度数据的代码。它实现了与传感器的串行通信协议,并解析传感器返回的40位数据,提供准确的温度和湿度数值。驱动程序的编写需要熟悉GPIO控制和数据解析等技术。 ### 回答3: microPython是一种适用于微控制器的精简Python版本,它允许我们使用Python语言编程来控制和驱动各种硬件设备,包括DHT11温湿度传感器。 DHT11驱动程序是一个用于与DHT11传感器进行通信的软件程序。它通过传感器的数据引脚与微控制器的引脚相连,在程序中通过一系列指令来读取传感器的温度和湿度值。 在microPython中,我们可以使用相应的库或模块来实现DHT11驱动程序。例如,可以使用uPyCraft、Thonny或Mu等开发环境来编写和调试microPython代码。 具体的DHT11驱动程序实现步骤如下: 1. 导入必要的库或模块,例如machine和dht。 2. 初始化传感器,指定引脚号和传感器类型(DHT11)。 3. 执行温湿度读取操作,并将结果存储在相应的变量中。 4. 关闭传感器连接,释放资源。 5. 可以根据需求对读取到的温湿度数据进行处理和显示。例如,可以通过串口输出或使用OLED显示屏等方式将数据显示出来。 需要注意的是,不同的微控制器和开发板可能使用不同的引脚编号和库函数,因此在编写驱动程序时应根据具体的硬件和开发环境进行调整。 通过以上步骤,我们就可以实现一个microPython的DHT11驱动程序,从而方便地读取和处理传感器的温湿度数据。这种驱动程序的使用使得我们可以更加简单、高效地在嵌入式系统中利用DHT11传感器进行温湿度监测和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值