python 将计算结果保留到缓存中

python 将计算结果保留到缓存中,第1张

定义一个延迟属性的一种高效方法是通过使用一个描述器类,如下所示:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">class lazyproperty:

def init (self, func):

selffunc = func

</pre>

你需要像下面这样在一个类中使用它:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">import math

class Circle:

def init (self, radius):

selfradius = radius

</pre>

下面在一个交互环境中演示它的使用:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">>>> c = Circle(40)

</pre>

仔细观察你会发现消息 Computing area 和 Computing perimeter 仅仅出现一次。

很多时候,构造一个延迟计算属性的主要目的是为了提升性能。 例如,你可以避免计算这些属性值,除非你真的需要它们。 这里演示的方案就是用来实现这样的效果的, 只不过它是通过以非常高效的方式使用描述器的一个精妙特性来达到这种效果的。

正如在其他小节(如89小节)所讲的那样,当一个描述器被放入一个类的定义时, 每次访问属性时它的 __get__() 、 __set__() 和 __delete__() 方法就会被触发。 不过,如果一个描述器仅仅只定义了一个 __get__() 方法的话,它比通常的具有更弱的绑定。 特别地,只有当被访问属性不在实例底层的字典中时 __get__() 方法才会被触发。

lazyproperty 类利用这一点,使用 __get__() 方法在实例中存储计算出来的值, 这个实例使用相同的名字作为它的property。 这样一来,结果值被存储在实例字典中并且以后就不需要再去计算这个property了。 你可以尝试更深入的例子来观察结果:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">>>> c = Circle(40)

</pre>

这种方案有一个小缺陷就是计算出的值被创建后是可以被修改的。例如:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">>>> carea

Computing area

5026548245743669

</pre>

如果你担心这个问题,那么可以使用一种稍微没那么高效的实现,就像下面这样:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">def lazyproperty(func):

name = ' lazy ' + func name

@property

def lazy(self):

if hasattr(self, name):

return getattr(self, name)

else:

value = func(self)

setattr(self, name, value)

return value

return lazy

</pre>

如果你使用这个版本,就会发现现在修改 *** 作已经不被允许了:

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", Courier, monospace; font-size: 12px; white-space: pre; margin: 0px; padding: 12px; display: block; overflow: auto; line-height: 14;">>>> c = Circle(40)

py:最常见的 Python 源代码文件。

pyc:常见的 Python 字节码缓存文件,可以反编译成 py 文件。

pyo:另一种 Python 字节码缓存文件,只存在于 Python2 及 Python35 之前的版本。

pyi:Python 的存根文件,常用于 IDE 代码格式检查时的类型提示。

pyw:另一种 Python 源代码文件,一般只存在于 Windows 系统。

pyd:一种 Python 可直接调用的 C 语言动态链接库文件,一般只存在于 Windows 系统。

pyx:Cython 源代码文件,一般用来编写 Python 的 C 扩展。

在Python中,多进程独立缓存数据通常使用共享内存和进程锁技术来实现。共享内存可以让多个进程共享同一块内存空间,从而可以实现数据的共享,而进程锁可以保证多个进程对同一块内存空间进行互斥访问,避免数据冲突和不一致性。使用这种技术,可以让多个进程之间独立地缓存数据,避免数据重复计算和频繁的IO *** 作,从而提高程序的运行效率。不过需要注意的是,共享内存和进程锁的实现比较复杂,需要谨慎使用,否则可能会导致程序的性能下降或者出现数据不一致等问题。

from __future__ import division

import os

from collections import namedtuple

_nt_cpu_temp = namedtuple('cputemp', 'name temp max critical')

def get_cpu_temp(fahrenheit=False):

"""Return temperatures expressed in Celsius for each physical CPU

installed on the system as a list of namedtuples as in:

>>> get_cpu_temp()

[cputemp(name='atk0110', temp=320, max=600, critical=950)]

"""

# >

psutil是一个Python写的方便获取系统硬件和性能信息的库。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。

>>>import psutil

>>>psutilcpu_count() #逻辑CPU个数

>>>psutilcpu_count(logical=False) #物理CPU个数

>>>psutilcpu_percent() #cpu平均使用率

>>>psutilcpu_percent(3) #最近3秒钟cpu平均使用率

>>>psutilcpu_freq() #CPU频率

scpufreq(current=8040, min=00, max=21120)

>>>psutilcpu_stats() #CPU状态

scpustats(ctx_switches=1910389985, interrupts=2644388135, soft_interrupts=0, syscalls=3686421224)

>>>import psutil

>>>psutilvirtual_memory()

部分嵌入式系统:

svmem(total=16919429120, available=4207607808, percent=751, used=12711821312, free=4207607808)

linux系统:

svmem(total=135077658624,available=12628275200,percent=907,used=122103193600,free=10256912384,active=111388827648,inactive=6278348800,buffers=278413312,cached=2439139328,shared=184320)

解析

1)total:总物理内存,包括已使用的物理内存和没使用的物理内存

total = used + free

2)used:已使用的物理内存

3)free:没使用的物理内存

4)available:可用内存,其包括没使用的物理内存,缓冲(如存在),缓存(若存在)。

available = free + buffers + cached

注意available和free的区别

5)percent:内存使用率,(总物理内存大小 - 可用内存大小) / 总物理内存大小 100

percent = (total - available) / total 100

延伸

交换内存

>>>import psutil

>>>psutilswap_memory()

sswap(total=29810581504, used=26177650688, free=3632930816, percent=878, sin=0, sout=0)

>>>import psutil

>>>psutildisk_usage("C:") # C盘的使用率

sdiskusage(total=285441257472, used=103434944512, free=182006312960, percent=362)

>>>psutildisk_usage("/") # 根分区的使用率

sdiskusage(total=225328492544, used=77228355584, free=148100136960, percent=343)

>>>psutildisk_partitions() # 获取分区信息

[sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxf

ile=255, maxpath=260)]

>>>psutildisk_io_counters() #  获取硬盘总的io和读写信息

sdiskio(read_count=3036624, write_count=7461516, read_bytes=111278890496, write_bytes=176975582208, read_time=1369, write_time=3012)

>>>psutildisk_io_counters(perdisk=True) # 获取单分区的io和读写信息

{'PhysicalDrive0': sdiskio(read_count=3046900, write_count=7464803, read_bytes=111679064576, write_bytes=177050010624, read_time=1372, write_time=3014)}

以上就是关于python 将计算结果保留到缓存中全部的内容,包括:python 将计算结果保留到缓存中、电脑python缓存文件有哪些、python多进程独立缓存数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9439887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存