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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Navicat premium15 激活码【2022免费激活】2022.03.10

    (Navicat premium15 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1M2OME2TZY-eyJsaWNlb…

    2022年4月2日
    2.1K
  • nginx sendfile 参数解释

    nginx sendfile 参数解释转载地址: https://blog.csdn.net/renyican/article/details/50582085sendfile 现在流行的web服务器里面都提供sendfile选项用来提高服务器性能,那到底sendfile是什么,怎么影响性能的呢?sendfile实际上是Linux2.0+以后的推出的一个系统调用,web服务器可以通过调整自身的配置来决定是否利用sendfi…

    2022年6月5日
    40
  • scp命令传文件–远程ip加端口号的方式[通俗易懂]

    scp命令传文件–远程ip加端口号的方式[通俗易懂]scp命令传文件–远程ip加端口号的方式

    2022年8月22日
    8
  • 通过主机名得到对应ip地址_如何查看电脑主机名或Ip地址

    通过主机名得到对应ip地址_如何查看电脑主机名或Ip地址
         由于SILVERLIGHT是基于纯客户端的机制实现的,想在SL中获取客户端计算机信息暂时还没有效的解决方案。
    一般都是基于WCF、WebService等在服务端获取发送请求机器的信息,然后再返回客户端,该方法可以实现;
    同时可以在

    2022年10月9日
    4
  • 最全ASCii 码表和说明

    最全ASCii 码表和说明最全ASCii 码表和说明

    2022年4月24日
    125
  • windows端口转发工具_android 端口转发

    windows端口转发工具_android 端口转发比如我们在host2机器上面部署了很多服务,但是由于某种原因导致我们无法直接ssh访问该服务器已经其上服务的对应端口,但是host3服务器,既能够访问host2服务器,又可以访问我们的host1服务器。这时,我们就可以通过设置ssh来进行服务的访问。但是还有两个问题:你需要保持终端开启防止SSH进程被关闭;由于网络故障/波动导致SSH终断时无法自动重连。前者可以使用tmux等第三方工具来解决,后者需要supervisor等第三方监控工具,不过我们还有一个更常用的选…

    2025年5月23日
    4

发表回复

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

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