首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将代码作为模块导入比在Python中导入单个代码块要慢得多

将代码作为模块导入比在Python中导入单个代码块要慢得多
EN

Stack Overflow用户
提问于 2018-01-09 01:26:03
回答 1查看 145关注 0票数 0

我正在编写一段代码,将图像从raspberry-pi3流式传输到我的笔记本电脑上。我写了两个版本的代码,一个使用模块,另一个作为单独的代码块。我把代码放在这里(代码后面有更多细节)

运行速度快的代码:

代码语言:javascript
复制
import picamera
import socket
import struct
import time
import io

stream_client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
stream_client.connect(('192.168.43.34',9000))
print('connected')
camera = picamera.PiCamera()
camera.resolution=(320,240)
camera.color_effects=(128,128)
camera.framerate=18
time.sleep(2)
stream = io.BytesIO()
count=0
start=time.time()

try:
    for i in camera.capture_continuous(stream,'jpeg',use_video_port=True):
        count+=1
        stream_client.sendall(struct.pack('<L',stream.tell()))
        stream_client.sendall(struct.pack('<h',count))
        stream_client.sendall(stream.getvalue())
        stream.seek(0)
        stream.truncate()
        if(time.time()-start>10):
            break
finally:
    stream_client.sendall(struct.pack('<L',0))
    stream_client.close()
    camera.close()
    print('connection closed')

运行缓慢的代码:

模块(包含在同一文件夹中的另一个文件"CameraStreamModule.py“中):

代码语言:javascript
复制
'''
MODULE NAME: CAMERA STREAMING MODULE
OBJECTIVE: TO SEND IMAGE DATA FROM RASPBERRY-PI3 TO LAPTOP VIA TCP/IP STREAM
HARDWARE USED: RASPBERRY PI 3, PI CAMERA REV 1.3
PYTHON VERSION: 3.5.3
DATE WRITTEN: 8-1-2018
'''

'''************************************************************** IMPORTING MODULES ***********************************************************************'''
import picamera # PI CAMERA MODULE
import socket # MODULE TO HANDLE TCP/IP CONNECTION AND TRANSFER 
import struct # MODULE TO CONVERT DATA TO BYTE-LIKE OBJECTS (REQUIRED BY SOCKET METHODS)
import time # MODULE FOR TIME RELATED FUNCTIONS
import io # MODULE USED TO CREATE IN-MEMORY DATA STREAMS
'''************************************************************ MODULE IMPORTS END HERE *******************************************************************'''

'''*********************************************************** DECLARING GLOBAL VARIABLES *****************************************************************'''
LIMITED_STREAM = False # Stream only for short time when true
LIMIT_TIME= 10 # Seconds
stream = io.BytesIO()
stream_client= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
camera = picamera.PiCamera()
count=0
'''*********************************************************** GLOBAL VARIABLES END HERE ******************************************************************'''

'''************************************************************** METHOD DEFINITIONS ***********************************************************************'''


def Client_init (Server_ip,Server_port): # (str,int) expected as parameter
    global stream_client,start,LIMITED_STREAM
    stream_client.connect((Server_ip,Server_port))
    if LIMITED_STREAM :
        start=time.time()
    print('connected')


def Camera_init (Resolution_tuple,Colour_tuple,Frame_rate): # (int_tuple,int_tuple,int) expected as parameter
    global camera
    camera.resolution= Resolution_tuple
    camera.color_effects=Colour_tuple
    camera.framerate= Frame_rate
    time.sleep(2)


'''
THIS METHOD IS INTENDED TO BE CALLED INSIDE "for i in camera.capture_continuous(stream,'jpeg',use_video_port=True):" CONTINUOUSLY. ALSO .close() FOR SOCKET
AND CAMERA MUST BE CALLED SEPERATELY.
'''
def Send_frame (): 
    global count,stream_client,stream,LIMITED_STREAM

    count+=1
    stream_client.sendall(struct.pack('<L',stream.tell()))
    stream_client.sendall(struct.pack('<h',count))
    stream_client.sendall(stream.getvalue())
    stream.seek(0)
    stream.truncate()
    if LIMITED_STREAM:
        if(time.time()-start>LIMIT_TIME):
            raise Exception('Time Finished')

'''********************************************************* METHOD DEFINITIONS END HERE ******************************************************************'''

调用代码:

代码语言:javascript
复制
import importlib

Camera_module= importlib.import_module('CameraStreamModule')

Camera_module.LIMITED_STREAM= True
Camera_module.Client_init('192.168.1.102',9000)
Camera_module.Camera_init((320,240),(128,128),18)
try:
    for i in Camera_module.camera.capture_continuous(Camera_module.stream,'jpeg',use_video_port=True):
        Camera_module.Send_frame()
finally:
    Camera_module.camera.close()
    Camera_module.stream_client.sendall(struct.pack('<L',0))
    Camera_module.stream_client.close()
    print('connection closed')

第一个代码在10秒内传输了大约179个图像,第二个版本传输了大约133个图像,这是一个急剧的减少。我只是想创建一个模块,使代码更易于管理和阅读。

我最近开始用Python编写代码,我知道我的编码方法对于更有经验的程序员来说可能看起来很可笑(相信我,我正在努力改进)。谁能告诉我这种减速的原因是什么?

我观察到,即使更改WiFi连接也会影响在给定时间内传输的数据量,因此我对两个版本的代码保持相同的WiFi连接。

我认为发生这种减速是因为我在模块之间来回传递了大量数据?

在任何情况下,都欢迎关于代码的任何建议/帮助。

附言:如果你觉得我在这个平台上提问的方式不符合标准,我需要提供更多或减少细节,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-24 13:50:33

好了,我发现了问题所在。实际上,在我创建的接收器代码中,我出于调试目的编写了很多print()语句。这是导致延迟的原因,因此我丢失了一些数据,因为套接字传输是异步的(并且我没有处理代码中的数据丢失问题)。此外,在模块之间来回传递大型数组数据的延迟也会导致此问题

把这个答案留在这里,以防有人觉得有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48155129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档