python访问内存_为什么我可以在Python中访问看似任意的内存地址?

我在NumPy中使用strides进行游戏,我意识到您可以轻松地超越数组的界限:

>>> import numpy as np

>>> from numpy.lib.stride_tricks import as_strided

>>> a = np.array([1], dtype=np.int8)

>>> as_strided(a, shape=(2,), strides=(1,))

array([ 1, -28], dtype=int8)

这样,我可以读取数组外部的字节,也可以写入其中.但是我不知道这怎么可能.为什么操作系统没有阻止我?在抛出分段错误之前,我似乎可以离开此阵列至少100 KB.

我唯一想到的就是该内存空间是由我的Python进程直接分配的. NumPy会这样做吗?这个空间有固定的大小吗?还有什么其他对象?

解决方法:

这里有两种不同的内存分配器在起作用:

>操作系统,可在Unix下通过以下方式访问: brk(2)或mmap(2).这通常会提供您所需的确切信息,但它不是很友好.

> C运行时堆,可通过malloc(3)和free(3)访问.这可能会或可能不会立即将释放的内存返回给操作系统.如果性能更高,它也可以将分配向上舍入到最近的页面.这通常根据(1)来实现.

大多数应用程序,包括NumPy和Python,都使用(2)而不是(1)(或者它们在(2)之上实现了自己的内存分配器).结果,根据(2)无效的内存可能仍然根据(1)有效.如果违反方法(1)的规则,则只会发生段错误.您还可能与堆上的其他活动对象进行交互,这很可能导致程序以任意方式异常运行,即even if you are not changing anything.

标签:cpython,memory,python,numpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Python,epsilon通常指的是一个非常小的数值,通常用于比较两个浮点数是否相等。由于浮点数在计算机的存储方式,可能会出现精度误差,因此在比较浮点数时,通常需要使用epsilon来判断它们是否足够接近。epsilon的值通常取决于具体的应用场景和精度要求。 ### 回答2: 在Python,epsilon通常指的是极小值(“infinitesimal”)。epsilon是一个数值,可以表示任意接近于零的值。它通常用于比较小数和几乎等于零的值。实际上,epsilon是一个非常小的正数,其值通常在10的负七次方左右。 在Python,epsilon通常应用于浮点数的比较运算。由于浮点数的舍入误差,两个看似相等的浮点数在计算机可能会被当作不相等的。因此,当进行浮点数的比较运算时,我们经常会在实数之间添加一个很小的epsilon值,以确定它们是否足够接近。 例如,在Python,当我们希望判断两个浮点数a和b是否相等时,可以这样写: if abs(a - b) < epsilon: print("相等") else: print("不相等") 在这里,epsilon的值通常会很小,例如1e-7或1e-8。如果两个浮点数的差小于epsilon,则认为它们相等。 总之,epsilon在Python是一个非常有用的概念,它可以帮助我们减少浮点数比较运算的误差,并确保我们得到正确的结果。 ### 回答3: 在Python,epsilon是一个小数值,通常用于比较两个浮点数是否相等。由于浮点数进行计算会存在精度误差,因此直接用“==”判断两个浮点数是否相等可能会失效。因此,常常需要通过比较两个浮点数的差值是否小于一个极小值epsilon来判断它们是否相等。 在Python,通常使用sys.float_info.epsilon作为epsilon的值。sys.float_info.epsilon表示在浮点类型下,1.0与比它大的最小值之间的差距,也就是最小可能的浮点数。epsilon的大小取决于机器的浮点数处理方式和实现方式,一般情况下epsilon的值都非常小,一般不会超过$10^{-7}$。因此,通过找到最小的epsilon值来比较两个浮点数是否相等是一个比较可靠的方法。 需要注意的是,epsilon只适用于比较相对大小较小的浮点数,当浮点数的差值比epsilon要大时,判断结果可能会出现误差。因此,对于比较差值较大的浮点数,需要采用其他比较方法,比如将两个浮点数的差值除以其一个浮点数,再比较相对误差是否小于一个较小的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值