Python数组的使用_算法高效性

Python数组的使用_算法高效性如果我们需要一个只包含数字的列表,那么使用数组方式比list方式更高效。而且数组还支持所有跟可变序列有关的操作,比如移除列表中的一个元素(.pop)、插入元素(.insert)和在列表末尾一次性追加另一个序列中的多个值(.extend)。除此之外,数组还定义从文件读取(.frombytes)与写入(.tofile)的效率更高的方法。创建数组需要一个类型码,形如array(‘d’),这个类型码是用来表示在底层实现的C语言的数据类型。一般我们用的Python底层是用C语言编写实现的&n

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

如果我们需要一个只包含数字的列表,那么使用数组方式比 list 方式更高效。而且数组还支持所有跟可变序列有关的操作,比如移除列表中的一个元素(.pop)、插入元素(.insert) 和 在列表末尾一次性追加另一个序列中的多个值(.extend)。 除此之外,数组还定义从文件读取(.frombytes)与写入(.tofile)的效率更高的方法。

创建数组需要一个类型码,形如 array(‘d’),这个类型码是用来表示在底层实现的 C 语言的数据类型。一般我们用的 Python 底层是用 C 语言编写实现的 ,所以又称为 CPython。

Python 定义了以下这些类型码:

类型码 C 类型 Python 类型 所占字节 注释
‘b’ signed char int 1
‘B’ unsigned char int 1
‘u’ Py_UNICODE Unicode 字符 2 (1)
‘h’ signed short int 2
‘H’ unsigned short int 2
‘i’ signed int int 2
‘I’ unsigned int int 2
‘l’ signed long int 4
‘L’ unsigned long int 4
‘q’ signed long long int 8
‘Q’ unsigned long long int 8
‘f’ float float 4
‘d’ double float 8

注释 (1):'u' 类型码对应于 Python 中已过时的 unicode 字符 (Py_UNICODE 即 wchar_t)。 根据系统平台的不同,它可能是 16 位或 32 位。

比如 b 类型码表示的是有符号字符( signed char ),array(’ b ‘)创建出的数组就只能存放一个字节大小的整数,范围从 -128 到 127 。通过这样的限制,即使序列很长,拥有很多数字,也能节省空间。

数组定义好类型,就不能存放非定义类型的数据。

Luciano Ramalho 举了一个示例来说明数组的高效性。首先创建一个有 1000 万个随机浮点数的数组,然后写入数据,最后读取出数据。

from array import array
from random import random

floats = array('d', (random() for i in range(10 ** 7)))
logging.info('floats[-1] -> %s', floats[-1])

fp = open('floats.bin', 'wb')
floats.tofile(fp)
fp.close()

floats2 = array('d')
fp = open('floats.bin', 'rb')
floats2.fromfile(fp, 10 ** 7)
fp.close()
logging.info('floats2[-1] -> %s', floats2[-1])
logging.info('floats2==floats -> %s', floats2 == floats)

运行结果:

INFO - floats[-1] -> 0.9160358679542017
INFO - floats2[-1] -> 0.9160358679542017
INFO - floats2==floats -> True

通过 cProfile 模块分析代码性能,输出如下结果:

INFO -          192 function calls (180 primitive calls) in 0.098 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.061    0.061    0.061    0.061 {method 'fromfile' of 'array.array' objects}
        1    0.030    0.030    0.030    0.030 {method 'tofile' of 'array.array' objects}
        2    0.007    0.003    0.007    0.003 {built-in method io.open}
...

可以看到创建 1000 万个随机浮点数的数组,并实现读写文件操作,仅需 0.01 s 左右。生成的文件大小约为 73M。

  1. 首先利用生成器表达式创建一个可迭代对象,** 表示乘方,接着生成一个双精度浮点数组(类型码是 ‘d’);
  2. array 的 -1 索引值可以获取到数组中最后一个元素;
  3. “wb” 是以二进制写方式打开文件,w 是 write 的缩写;而 b 是 binary 的缩写;

binary /ˈbaɪnəri
using only 0 and 1 as a system of numbers

  1. 创建数组时,可以初始化,也可以不初始化直接创建一个空数组,形如: array(‘d’);
  2. fromfile() 方法的第二个入参用于指定数值最大范围;
  3. 可以看到从文件中读取到的数组与存入的数组是完全一致的。

因为 array.tofile 是把数据写入到二进制文件,所以比直接写入文本文件快很多。据统计,两者在性能上会相差近 7 倍。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170329.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • uos访问windows共享打印机_Linux打印机安装命令

    uos访问windows共享打印机_Linux打印机安装命令Unraid安装CUPS实现共享打印和无线打印2020-11-2916:08:3451点赞486收藏51评论创作立场声明:个人瞎折腾,文中部分内容来自网络,本人并非专业人士,只是将个人的折腾经验分享给大家,如有错误请大家指正今年上半年买了一台高配蜗牛,蜗牛D的机箱、G5400的cpu、B365的板子,就开始了一系列的折腾,更换了8700tescpu,带pcie插槽的蜗牛C机箱,4口pci…

    2022年10月9日
    0
  • wing是什么_完全二叉树的深度

    wing是什么_完全二叉树的深度设一个 n 个节点的二叉树 tree 的中序遍历为(1,2,3,…,n),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:subtree的左子树的加分 × subtree的右子树的加分 + subtree的根的分数若某个子树为空,规定其加分为 1。叶子的加分就是叶节点本身的分数,不考虑它的空子树。试求一棵符合中序遍历为(1,2,

    2022年8月8日
    1
  • python进阶(18)@wraps装饰器[通俗易懂]

    python进阶(18)@wraps装饰器[通俗易懂]前言我们都知道装饰器的作用是在不改变原有的代码基础上,添加新的功能,但是这样会有一个弊端,被装饰的函数某些属性会变改变,接下来我们来看下案例importtimedefrun_time(fu

    2022年8月7日
    1
  • Cinemachine 文档[通俗易懂]

    Cinemachine 文档[通俗易懂]https://docs.unity.cn/Packages/com.unity.cinemachine@2.8/manual/index.html

    2022年5月20日
    42
  • webapp开发实战_html5开发手机app实例

    webapp开发实战_html5开发手机app实例从事单页相关的开发一年有余,期间无比的推崇webapp的网站模式,也整理了很多移动开发的知识点,但是现在回过头来看,webapp究竟是好还是不好真是一言难尽哟!webapp使用JavaScript修改页面;紧接着再从服务器传递更多数据然后再修改页面,如此循环。从性能的角度看,在现代浏览器中单页面WebApp已经能够和普通native应用程序相媲美,而且几乎所有的操作系统都支持现代的浏览器…

    2022年4月20日
    61
  • 小米6最好用的系统版本[通俗易懂]

    小米6最好用的系统版本[通俗易懂]小米6最好用的系统版本小米6最好用的系统稳定版10.4.3首先说一下为什么这个版本的系统我认为最好用,因为自己是米粉,也比较喜欢用最新的系统,去年用小米6收到了10.4.2版本的系统更新,体验之后感觉真的很nice,安卓9流畅度提升非常高,包括软件的启动速度,各项反应,但是有一些小瑕疵,比如断流,软件闪退,系统掉帧,然后过了一段时间小米推送了10.4.3稳定版,修复了这三个问题,体验至今为止,没有其他任何问题该版本优点总结如下第一,该版本基于miui10,系统简单易用,基本上算是miui的一个小成的

    2022年6月27日
    106

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号