出于易读性的目的,我希望有一个自定义类,其行为与dict完全相同(但是带有有意义的类型,而不是更通用的dict类型):

class Derivatives(dict):

"Dictionary that represents the derivatives."

现在,有没有一种方法可以以不涉及副本的方式构建此类的新对象?天真的用法

derivs = Derivatives({var: 1}) # var is a Python object

实际上创建了作为参数传递的字典的副本,出于效率原因,我希望避免使用该副本.

我试图绕过副本但是在CPython中无法更改dict的类:

class Derivatives(dict):

def __new__(cls, init_dict):

init_dict.__class__ = cls # Fails with __class__ assignment: only for heap types

return init_dict

我希望能够为程序操作的字典提供显式类名,并且能够有效地构建这样的字典(而不是强制复制Python字典).这在Python中有效吗?

PS:用例可能是单键Derivatives的100,000个创建,其中键是变量(不是字符串,所以没有关键字初始化).这实际上并不慢,所以“效率原因”在这里意味着更像“优雅”:理想情况下,当不需要副本时,不需要浪费时间复制.因此,在这个特殊情况下,问题更多的是Python在这里带来的优雅/清晰度,而不是运行速度.

最佳答案 TL; DR:除非你用C做,否则没有通用的方法.

答案很长:

dict类是用C实现的.因此,没有办法访问它的内部属性 – 最重要的是,它是内部哈希表,除非你使用C.

在C中,您只需将表示哈希表的指针复制到对象中,而无需迭代dict(键,值)对并将它们插入到对象中. (当然,它比这更复杂.请注意,我省略了内存管理细节).

更长的回答:

我不确定你为什么关心效率.

Python将参数作为引用传递.除非您明确告知,否则很少每个副本都有.

我在评论中读到你不能使用命名参数,因为键是实际的Python对象.这让我明白你担心复制dict键(也许是值).但是,即使是字典键也不会被复制,并通过引用传递!考虑以下代码:

class Test:

def __init__(self, x, y):

self.x = x

self.y = y

def __hash__(self):

return self.x

t = Test(1, 2)

print(t.y) # prints 2

d = {t: 1}

print(d[t]) # prints 1

keys = list(d.keys())

keys[0].y = 10

print(t.y) # prints 10! No copying was made when inserting object into dictionary.

因此,唯一关注的区域是迭代dict并在Derivatives类中插入值.这是不可避免的,除非你能以某种方式将类的内部哈希表设置为dict的内部哈希表.在纯python中无法做到这一点,因为dict类是用C实现的(如上所述).

请注意,其他人建议使用生成器.这似乎也是一个好主意 – 比如你是从文件中读取衍生物还是用简单的公式生成它们.它会避免首先创建dict对象.但是,如果生成器只是列表(或任何其他可以包含一组值的数据结构)的包装器,那么效率将不会有显着的提高.

你最好的选择是坚持你的原始方法.生成器很棒,但它们无法有效地表示一组具有一系列值(在您的场景中可能就是这种情况).用C做它也是不值得的.

编辑:毕竟,在C中做它可能是值得的!

我对Python C API的细节不太了解,但考虑在C中定义一个类,例如DerivativesBase(从dict派生).您所做的就是在C中为DerivativesBase定义一个__init__函数,它将dict作为参数并将散列表指针从dict复制到DerivativesBase对象中.然后,在python中,Derivatives类派生自DerivativesBase并实现大部分功能.

python定义词典_python – 自定义类是一个字典,但初始化没有字典副本?相关推荐

  1. python定义词典_python定义字典

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python中默认的dict方法定义多维字典较为复杂并不能直接通过a=dict ...

  2. python对数组排序代码实现_Python自定义类的数组排序实现代码

    首先把实现方法写出来,其实很简单,只需要一句代码即可: 复制代码 代码如下: productlist.sort(lambda p1, p2:cmp(p1.getPrice(), p2.getPrice ...

  3. python计算复数的辐角_Python 自定义类中的函数和运算符重载

    如果你曾在字符串(str)对象上进行过 + 或 * 运算,你一定注意到它跟整数或浮点数对象的行为差异: >>> # 加法 >>> 1 + 2 3 >>& ...

  4. python定义整数_Python | 程序定义一个整数值并打印

    python定义整数 Define an integer value in a variable and print it in Python. 在变量中定义一个整数值,然后在Python中打印出来. ...

  5. python编程词典_Python 字典(Dictionary)操作详解

    Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 一.创建字典 字典由键和对应值成对组成.字典也被称作关联数组或哈希表.基本语法如下: dict = { ...

  6. [转载] python单词词典_Python 字典(Dictionary)

    参考链接: Python字典dictionary clear方法 Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>valu ...

  7. python汉语词典_Python 字典(Dictionary)

    Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在 ...

  8. 在ArrayList中根据自定义类的一个属性找某个对象

    今天写了学生管理系统,有很多认识太浅,所以先记录下来一点现在的一些收获 remove和contains都调用了equals 当遇到类似于:根据对象的一个属性去找到这个对象对其操作时,并且这个对象不是S ...

  9. python输入整数_Python中实现输入一个整数的案例

    我就废话不多说了,大家还是直接看代码吧!Y76免费资源网 #! usr/bin/python3.5 # -*- coding:utf-8 -*- a = input("请输入一个整数:&qu ...

最新文章

  1. 如何把 Word 中的表格快速插入 LaTeX?
  2. Apache20、lighttpd、nginx的比较[zt]
  3. IKAnalyzer实现扩展词库+动态更新词库的方法
  4. 【Python3爬虫】用Python中的队列来写爬虫
  5. 现代通信原理10.1:带宽无限信道下采用低通滤波器(LPF)接收时的误码性能分析
  6. 觅风易语言视频教程全集(143集)
  7. win10重装应用商店
  8. 外星文明 未来计算机,科学家有望未来在地球“设计打印”外星生命
  9. [渝粤教育] 天津师范大学 创业起跑线 参考 资料
  10. 非专业网管经历的回顾之二新兵训练(一)
  11. firewalld中理解直接规则和富语言
  12. 华为主题 主题兑换券活动高端操作
  13. 几个不错的extjs的blog
  14. 荣耀智慧屏评测 鸿蒙OS加持,荣耀智慧屏评测:鸿蒙OS加持 面向未来的超智能电视...
  15. 0基础学习——了解操作符的那些事(一)
  16. 匪夷所思!意念「返生」熟鸡蛋论文引争议,新华社:一个敢写一个敢发
  17. php 如何股票曲线图,如何看股票曲线图?股票曲线图讲解
  18. 物联网大数据平台TIZA STAR架构解析
  19. 【Kaggle比赛常用trick】K折交叉验证、TTA
  20. ubuntu 修改旋转屏幕显示方向

热门文章

  1. a*算法的优缺点_五种聚类算法一览与python实现
  2. 爬虫 无访问权限“_Windows10电脑系统共享打印机无访问权限解决方法
  3. mysql 找不到hdfs文件_hadoop判断文件是否存在
  4. CTF-不一样的凯撒密码
  5. Python内置函数大全
  6. 原来Python函数只是个对象
  7. python 自定义异常和主动抛出异常(raise)的操作
  8. python 获取本机IP的三种方式
  9. 路由(route)是什么意思?
  10. word文档怎么限制编辑(禁止编辑、只读)?