流畅的python--小技巧总结

对于百万级以上数据的读写效率优化

在Python中,我们可以通过array模块来方便地创建和操作数组,array模块提供了性能优异的数组操作方法,可以使我们的代码更加高效。同时,Python也提供了读写二进制文件和普通文本文件的方法,对于一些需要处理大量数据的程序,我们可以通过比较二者的性能来选择更加高效的操作方式。

读写二进制文件和普通文本文件的性能对比:

from array import array
import os
from time import time# 生成测试数据
a = array('i', range(1000000))# 测试 array.fromfile() 和 array.tofile()
t1 = time()
with open('test.bin', 'wb') as f:a.tofile(f)
with open('test.bin', 'rb') as f:b = array('i')b.fromfile(f, len(a))
t2 = time()
print(f"array.fromfile() and array.tofile(): {t2-t1:.6f} seconds")
os.remove('test.bin')# 测试普通文本文件读写
t3 = time()
with open('test.txt', 'w') as f:for i in a:f.write(str(i) + '\n')
with open('test.txt', 'r') as f:b = []for line in f:try:b.append(int(line.strip()))except ValueError:pass
t4 = time()
print(f"Text file read and write: {t4-t3:.6f} seconds")

运行上述代码会得到以下结果

array.fromfile() and array.tofile(): 0.021007 seconds Text file read and write: 7.798990 seconds

我们可以发现,在处理大量数据时,二进制文件读写的性能要远远优于普通文本文件读写。这是因为,在使用普通文本文件进行读写时,需要将每个元素转换成字符串并添加换行符,这些额外的操作会影响程序的性能

快速在有序序列中插入一个元素,并保持有序性

import bisectmy_list = [1, 3, 4, 7, 8, 10]
bisect.insort(my_list, 6)
print(my_list)  

bisect.insort使用二分查找算法来查找元素应该插入的位置,然后使用list.insert()方法将元素插入到该位置。这个函数的时间复杂度为O(log n),其中n是序列的长度。

bisect.insort()函数的实现方式与bisect.bisect()函数类似。bisect.bisect()函数返回元素应该插入的位置,而bisect.insort()函数则将元素插入到该位置

使用双向队列

collections.deque类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的数据类型。而且如果想要有一种数据类型来存放“最近用到的几个元素”,deque也是一个很好的选择。这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素

以下介绍两个使用双向队列的小案例:

  1. 实现一个滑动窗口

双向队列可以用于实现一个滑动窗口,该窗口可以在O(k)的时间复杂度内在一个序列中滑动,其中k是窗口的大小。以下是一个简单的示例:

from collections import dequedef sliding_window(nums, k):# 在序列nums中实现一个大小为k的滑动窗口result = []window = deque()for i, num in enumerate(nums):if i >= k and window[0] <= i - k:window.popleft()while window and nums[window[-1]] >= num:window.pop()window.append(i)if i >= k - 1:result.append(nums[window[0]])return result

在这个示例中,sliding_window()函数使用双向队列实现了一个大小为k的滑动窗口。该函数首先创建一个空的双向队列window,然后遍历序列nums中的每个元素。在每个元素上,该函数执行以下操作:

  • 如果队列中的第一个元素已经超出了窗口的范围,则将其从队列中删除。
  • 如果队列中的最后一个元素大于等于当前元素,则将其从队列中删除,直到队列为空或者最后一个元素小于当前元素。
  • 将当前元素的下标添加到队列的末尾。
  • 如果当前元素的下标大于等于k-1,则将队列中的第一个元素添加到结果列表中。

这个函数的时间复杂度为O(n),其中n是序列的长度。

  1. 实现一个循环队列

双向队列可以用于实现一个循环队列,该队列可以在O(1)的时间复杂度内在队列两端进行插入和删除操作。以下是一个简单的示例:

from collections import dequeclass CircularQueue:# 初始化一个大小为k的循环队列def __init__(self, k):self.k = kself.queue = deque(maxlen=k)# 将一个元素插入到队列的尾部。如果队列已满,则返回Falsedef enQueue(self, value):if len(self.queue) < self.k:self.queue.append(value)return Trueelse:return False# 将队列的头部元素删除。如果队列为空,则返回Falsedef deQueue(self):if self.queue:self.queue.popleft()return Trueelse:return False# 返回队列的头部元素。如果队列为空,则返回-1def Front(self):return self.queue[0] if self.queue else -1# 返回队列的尾部元素。如果队列为空,则返回-1def Rear(self):return self.queue[-1] if self.queue else -1

这个类的时间复杂度为O(1)

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/204211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rename--CAM在checkpoint恢复上的流程与优势

参考自&#xff1a;计算机体系结构-寄存器重命名 - 知乎 (zhihu.com) 这里的重点在红色部分描述上&#xff0c;也是容易想不通的地方&#xff1b; 在SRAM方法中要恢复映射表状态&#xff0c;需要事先把分支指令来临时刻的映射表全份拷贝下来&#xff0c;然后在恢复时把备份复制…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

AMEYA360分析兆易创新GD32A490系列车规级MCU

兆易创新GigaDevice今日宣布&#xff0c;正式推出全新GD32A490系列高性能车规级MCU&#xff0c;以高主频、大容量、高集成和高可靠等优势特性紧贴汽车电子开发需求&#xff0c;适用于车窗、雨刷、智能车锁、电动座椅等BCM车身控制系统&#xff0c;以及仪表盘、娱乐影音、中控导…

每日OJ题_算法_双指针②_力扣1089. 复写零

目录 力扣1089. 复写零 解析代码 力扣1089. 复写零 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 难度 简单 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在…

4.3 容器编排工具的比较与选择

容器编排工具的比较与选择 Kubernetes 介绍 Kubernetes&#xff0c;是目前最流行和功能强大的容器编排平台之一。强调 Kubernetes 的自动化、高可用、扩展性和灵活的特点。讨论 Kubernetes 的主要组件和架构&#xff0c;如 Master 节点、Node 节点、控制器和调度器等。分析 Ku…

智慧景区(园区)数字孪生可视化GIS解决方案

随着技术的日新月异&#xff0c;景区日常管理及运营中使用到的智慧化工具越来越丰富&#xff0c;智慧化硬件设备也越来越多&#xff0c;而其中各个管理系统往往又是相互独立&#xff0c;形成一个个数据孤岛。智慧景区管理平台就是将各个孤岛中的数据及功能汇集起来&#xff0c;…

政采云基于 Dubbo 的混合云数据跨网实践

作者&#xff1a;王晓彬&#xff0c;政采云资深开发工程师 项目背景 政采云的业务是为政府提供的购物网站&#xff0c;类似于淘宝。政府采购会在政采云上做企业采购、政府采购的业务。 云岛中的“云”是指我们的云平台&#xff0c;云平台是我们公司自己部署的一套购物网站&a…

【计算机网络漫谈】OSI七层模型与TCP/IP四层(参考)模型

一、七层&#xff1f;四层&#xff1f; 1.为什么需要协议&#xff1f;2.OSI七层模型是干什么的&#xff1f;3.TCP/IP四层&#xff08;参考&#xff09;模型4.TCP/IP&#xff08;参考&#xff09;模型与OSI七层模型有什么异同&#xff1f; 二、自底向上的网络分层 1. 物理层2…

阻止事件e.stopPropagation()和e.preventDefault的区别

e.stopPropagation() 和 e.preventDefault() 是两个在事件处理中常用的方法&#xff0c;它们有不同的作用&#xff1a; e.stopPropagation(): 作用&#xff1a;阻止事件在DOM中的进一步传播&#xff0c;即停止事件冒泡。使用场景&#xff1a;当你希望阻止一个事件从目标元素向上…

防火墙 iptables的使用

目录 什么是防火墙 原理 代理 防火墙的工具 4表5列 五链&#xff1a;控制流量的时机 四个表&#xff1a;如何控制流量 ​编辑 iptables 软件 格式 选项 跳转 查iptables 的规则 添加规则 A I 删除规则 清空规则 替换规则 R 修改默认规则&#xff08;默…

校园外卖小程序源码系统 附带完整的搭建教程

随着大学生消费水平的提高&#xff0c;对于外卖服务的需求也在不断增加。很多学生都面临着课业繁重、时间紧张等问题&#xff0c;无法亲自到餐厅就餐。因此&#xff0c;开发一款适合校园外卖市场的应用软件&#xff0c;将为广大学生提供极大的便利。 以下是部分代码示例&#…

vector例题:hdu4841圆桌问题

解题代码来源于一本书&#xff1a;《算法竞赛&#xff1a;入门到进阶》 圆桌上围坐着2n个人。其中n个人是好人&#xff0c;另外n个人是坏人。如果从第一个人开始数数&#xff0c;数到第m个人&#xff0c;则立即处死该人&#xff1b;然后从被处死的人之后开始数数&#xff0c;再…

Python Numpy学习(1)

python: np.pad() 函数的用法 np.einsum(爱因斯坦求和约定) python编程之np.isnan()的用法 Python_Numpy库中各种矩阵基本运算 numpy基本加减和取行操作 numpy的加减乘除运算 NumPy 算术函数 TypeError: can’t convert cuda:0 device type tensor to numpy. Use Tenso…

了解linux网络时间服务器

本章主要介绍网络时间服务器。 使用chrony配置时间服务器 配置chrony客户端向服务器同步时间 20.1 时间同步的必要性 些服务对时间要求非常严格&#xff0c;例如&#xff0c;图20-1所示的由三台服务器搭建的ceph集群。 这三台服务器的时间必须保持一致&#xff0c;如果不一致…

【征稿倒计时十天】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

【有ISSN、ISBN号&#xff01;&#xff01;往届均已完成EI检索】 第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 2023 3rd International Conference on High Performance Computing and Communication Engineering (HPCCE 2023) 2023年12月22-24日 | 中国哈尔滨 第三…

base64 转

$img_base64 substr($res[photo],strrpos($res[photo],,));$img_decode base64_decode($img_base64);$namess time().rand(10000,99999);$cc file_put_contents(img/avatar/.$namess..png,$img_decode);$urlsDS . img . DS . avatar/ .$namess..png;

CSS新手入门笔记整理:CSS溢出声名overflow

通常一个盒子的内容是被限制在盒子边框之内的&#xff0c;但是有时也会溢出&#xff0c;即部 分或者全部内容跑到盒子边框之外。 语法 元素{overflow:取值&#xff1b;} 属性值 说明 visible 若内容溢出&#xff0c;则溢出内容可见&#xff08;默认值&#xff09; hid…

Redis的数据类型以及如何解决大Key问题

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、Redis的数据类型 二、Big Key 2.1 什么是Big Key&#xff1f; 2.2 Big Key产生的场景&#xff1f; 2.3 如何识别Big Key&am…

面试——Java中实现多态的三要素,实现多态的机制是什么?

1.实现多态的三要素&#xff1a; 继承、重写、弗雷德引用指向子类的对象 2.实现多态的机制&#xff1a; 靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象&#xff0c;而程序调用的方法在运行期才动态绑定&#xff0c;就是引用变量所指向的具体实例对象的方法…

数据结构与算法-D5-D7线性表之链表

结点类型描述 程序编写 节点定义 linklist.h linklist.c list_create 1、申请内存 2、赋值 3、返回头结点 list_tail_insert 1、建立一个新结点 2、找尾结点 3、尾部插入 list_show list_insert 链表在某一位置的插入 1、调用算法list_get 2、插入 1&#xff09;新节点 2&a…