![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
python 进阶
文章平均质量分 92
python 进阶
莫彩
首先是一个人,然后是一个程序员
展开
-
LTR入门:从 Ranknet 到 LambdaMart 原理与 lgb 实战
我们的任务是这样的:有一堆搜索引擎拿到的 query,我们标注了他们对购买商品的需求等级,即这个 query 的搜索者有多希望看到搜索结果里出现电商或者直播等内容来满足购买需求,我们希望搞一个 rank 任务来学习这个任务。doc 的特征以数值类特征为主,我们使用 lightgbm 来完成这个任务。原创 2023-01-09 01:01:51 · 1605 阅读 · 0 评论 -
python 性能优化
关于程序优化的第一个准则是“不要优化”,第二个准则是“不要优化那些无关紧要的部分”。原创 2023-01-03 00:40:18 · 968 阅读 · 1 评论 -
python中的装饰器
通过查看它的 func_closure 属性可以看出函数闭包特性。装饰器可以链式使用,但是一定要注意使用顺序。原创 2022-11-05 00:27:33 · 328 阅读 · 0 评论 -
python 语法拾遗
一些日常工作和学习中收集到的语法细节。原创 2021-04-20 23:56:20 · 131 阅读 · 0 评论 -
python源码剖析—— python中的Frame对象初探
而作用域是嵌套的,这就使得名字空间也是嵌套的,一个赋值语句引入的名字在赋值语句所在的作用域内生效,在其内部嵌套的每个作用域内都生效。这实际上是在模拟真实机器上的栈帧,在普通的x86机器上,当发生函数调用的时候,系统会在地址空间中创建新的栈帧并保存上一个栈帧的栈指针esp和帧指针ebp,这两个变量用于恢复上下文环境。我在文章中也屡次强调过,python的作用域是静态作用域,就是说,一个约束在程序正文中的某个位置是否起作用,是由该约束在代码中的位置唯一决定的。是不同的,这个信息需要动态的体现在上下文环境中。原创 2022-09-25 20:17:44 · 629 阅读 · 0 评论 -
python源码剖析—— python中的字节码对象初探
这个编译出的字节码是静态分析的结果,因此只要代码相同编译出的字节码就会相同,因此如果对于同样的字节码,重复编译是没有必要的,因此python会对符合一定规则的python文件(通常可以认为是被import的文件)编译出字节码并缓存下来,这个就是pyc文件。模块是反汇编工具,这个工具是python自己用不到的,因为反汇编是面向程序员的,机器只需要读取字节码的字节表示的数字就可以,程序员才需要将其转换为可读的指令名称。在下面展示的结果中,第一列是源码对应的行号,第二列是字节码的偏移量,然后是字节指令的名称。原创 2022-09-25 20:15:19 · 533 阅读 · 0 评论 -
python源码剖析—— python中的字典对象
C++的 STL 中的 map 就是一种关联容器,map 的实现基于 RB-tree(红黑树),理论上,其搜索的复杂度为 O(logN)。Python 中同样提供关联式容器,即对象。与 map 不同的是,对搜索的效率要求及其苛刻,这也是因为在 Python 本身的实现中被大量地采用,比如会通过来建立符号表。因此,采用了散列表(hashtable)。理论上,在最优情况下,散列表能提供 O(1)复杂度的搜索效率。原创 2022-09-25 20:13:47 · 1096 阅读 · 0 评论 -
python源码剖析—— python中的列表对象
这个操作是常数时间代价。对象可以有效地支持插入,添加,删除等操作,在 Python 的列表中,无一例外地存放的都是。函数则是实现了切片功能,当传入的v是NULL时,实际效果就是将被切的部分删除。没啥可说了,就是注意里面对索引的处理步骤,使得任意的索引值都可以处理,直接可以试试。函数中,这个函数会在当前空间的后面继续扩展,但是是否真的是这样,等待后续更新。而且与想象中不一样的是,该方法仅仅制定了元素的个数而没有指定元素的具体内容。指针放到指定的位置,然后将这个位置原来存放的对象的引用计数减 1。原创 2022-09-23 22:42:36 · 959 阅读 · 0 评论 -
python源码剖析—— python中的字符串对象
该机制规定:当两个或以上的字符串变量它们的值相同且仅由数字字母下划线构成而且长度在20个字符以内,或者值仅含有一个字符时,内存空间中只创建一个对象来让这些变量都指向该内存地址。不同的是,在 Python 的整数对象体系中,小整数的缓冲池是在 Python runtime 初始化时被创建的,而字符串对象体系中的字符缓冲池则是“按需使用”。上面的这个表述经过在 python 终端中的尝试,应该是正确无误的,但是我在Python源码中没有发现对大于一个字符的字符串的 intern 处理代码。原创 2022-09-21 19:53:18 · 726 阅读 · 0 评论 -
python源码剖析—— 初识 PyIntObject 对象
其次,Python内部也大量的使用整数对象,我们在自己的代码中也会有大量的创建销毁整型对象的操作,因此单独的维护整形对象并对其申请内存和释放内存是不现实的。另一个是干啥的稍微一想就能想到:这个 block 链表维护的是一整块block,是block级别的,我要使用的是。构成了一个整数系统,其下有两个“部门”,一个是静态对象池,一个是动态缓冲池,两个池的管理使用两个不同级别的指针。注意,新申请的 block 在链表头,这样做的原因是考虑到链表的插入效率。的操作,像前面说的,定义在该类型对象的函数指针中。原创 2022-09-16 23:01:12 · 337 阅读 · 0 评论 -
python源码剖析(1)—— PyObject
1. Python中的对象Python中一切皆是对象。————Guido van Rossum(1989)这句话只要你学过python,你就很有可能在你的Python学习之旅的前30分钟就已经见过了,但是这句话具体是什么意思呢?一句话来说,就是面向对象中的“类”和“对象”在Python中都是对象。类似于int对象的类型对象,实现了“类的概念”,对类型对象“实例化”得到的实例对象实现了“对象”这个概念。通常的说法是,对象是数据以及基于这些数据的操作的集合。在计算机上,一个对象实际上就是一片被分配原创 2021-05-13 20:08:15 · 494 阅读 · 2 评论 -
EM算法原理与推导(续)
关于更新参数关于参数如何更新,其实有多种解释都一样,但是为了理清思路,我们要明确一点就是我们即使不对混合模型的对数似然进行任何变化,也是可以做MLE估计的,只是得到的参数最优值不是一个解析式,而是一个涉及到“隐变量”的式子,这才导致我们后续的EM算法并通过迭代方式来最大化似然。用GMM举例子,我们希望极大化:l(θ)=∑i=1mlog∑zP(x(i),z(i);θ)(1) l(\theta)=\sum_{i=1}^mlog\sum_zP(x^{(i)},z^{(i)};\theta)\qquad(1)l原创 2021-04-26 00:40:15 · 185 阅读 · 0 评论 -
SICP5——迭代器与数据处理管道
一、python中的迭代器首先要区分开迭代器和可迭代对象,前者是指实现了__next__和StopIteration迭代器协议的python对象,后者是指可以使用iter得到其迭代器的对象。比如,iter(range(n))可以获得range对象的迭代器,实际上使用iter可以从任何可迭代对象中获得迭代器,迭代器唯一能做的就是next直到StopIteration。所有的迭代器都是可迭代对象,意思是你可以从一个迭代器中得到一个迭代器,因此你可以遍历一个迭代器。通常对迭代器使用iter方法返回的是该迭代器.原创 2021-04-25 00:34:19 · 227 阅读 · 0 评论 -
SICP3——使用python制作logo解释器
一、计算机程序的构造和解释简陋的计算器解释器典型的解释器拥有简洁的通用结构:两个可变的递归函数,第一个求解环境中的表达式,第二个在参数上调用函数。这些函数都是递归的,因为它们互相定义:调用函数需要求出函数体的表达式,而求出表达式可能涉及到调用一个或多个函数。对于嵌套的表达式可以解析为表达式树,表达式树可以使用树形结构编程表示,例如计算Fibonacci数的过程实际上可以表示为一棵树,树的节点中存放了计算结果。使用函数(闭包构建偏序对),使用偏序对构建递归列表,使用偏序对构成的列表构建字典,这意味着原创 2021-04-25 00:03:39 · 533 阅读 · 0 评论 -
SICP2——Python中使用函数构建对象
一、使用对象构建抽象1.1 数据抽象现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示对象。…根本不必考虑它们到底代表着什么东西。上一篇文章主要强调的是对数据的操作以及这些操作之间的组合与抽象,这个过程中使用到的主要工具是函数。对于数据自身,我们同样可以应用组合与抽象的基本技巧。数据抽象类似于函数抽象。当我们创建函数抽象时,函数如何实现的细节被隐藏了,而且特定的操作序列本身可以被任何具有相同行为的函数替换。换句话说,我们可以构造抽象来使函数的使用方式和函数的实现细节分离。与之相似,数据抽象是原创 2021-04-24 22:18:44 · 154 阅读 · 0 评论 -
SICP1——Python中的函数机制
一、使用函数构建抽象1.1 基本元素程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行编程语言都应该具有基本的元素,即表达式和语句,数据和函数是这两种基本元素的代表。有了基本元素之后,还要有合适的方式将他们进行组合以完成简单到复杂的构造。最后,可以对内容进行抽象,已完成复杂到简单的指代。首先要区分代码中的语句和表达式,这两者分别负责执行某个操作或者计算某个值。最简单的语句就是赋值语句了,赋值语句的执行作用就是负责将某个值和某个名字相关联,即“名称被绑定到了值上”,并将这种绑定存放在环境中。而表原创 2021-04-24 22:17:50 · 200 阅读 · 0 评论 -
Python Cookbook3 (12) 并发编程
并行计算环境中的正确性有两个标准。第一个是,结果应该总是相同。第二个是,结果应该和串行执行的结果一致。当一个进程在程序的临界区影响另一个进程时,并行计算中就会出现问题。这些都是需要执行的代码部分,它们看似是单一的指令,但实际上由较小的语句组成。一个程序会以一系列原子硬件指令执行,由于处理器的设计,这些是不能被打断或分割为更小单元的指令。为了在并行的情况下表现正确,程序代码的临界区需要具有原子性,保证他们不会被任何其他代码中断。为了强制程序临界区在并发下的原子性,需要能够在重要的时刻将进程序列化或彼此同步。原创 2021-04-24 01:03:44 · 126 阅读 · 0 评论 -
Why Python is Slow: Looking Under the Hood [译]
翻译自Why Python is Slow: Looking Under the Hood我们以前都听说过 : Python很慢。当我在Python上讲授关于科学计算的课程时,我在课程的早期就提出了这个观点,并告诉学生们为什么:它归结为Python是一种动态类型的解释语言,它的值不是存储在密集的缓冲区中,而是存储在分散的对象中。然后我将讨论如何通过使用NumPy、SciPy和相关工具对操作进行矢量化并调用到编译后的代码,然后继续。但最近我意识到一些事情:尽管上面的陈述相对准确,“动态类型-解释-缓存-翻译 2021-04-24 01:03:01 · 213 阅读 · 0 评论 -
Python Cookbook3 (9)元编程
1. 在函数上添加装饰器2. 创建装饰器时保留函数元信息3. 解除一个装饰器前面好好的看的话,装饰器这个内容现在已经算比较简单了。@wraps 有一个重要特征是它能让你通过属性__wrapped__直接访问被包装函数。__wrapped__ 属性还能让被装饰函数正确暴露底层的参数签名信息。直接访问未包装的原始函数在调试、内省和其他函数操作时是很有用的。但是我们这里的方案仅仅适用于在包装器中正确使用了 @wraps 或者直接设置了 __wrapped__ 属性的情况。如果有多个包装器,那么访问 __wr原创 2021-04-24 01:00:48 · 112 阅读 · 0 评论 -
Python Cookbook3 (8)类与对象
1. 改变对象的字符串显示自定义__repr__() 和__str__()通常是很好的习惯,因为它能简化调试和实例输出。例如,如果仅仅只是打印输出或日志输出某个实例,那么程序员会看到实例更加详细与有用的信息。repr()生成的文本字符串标准做法是需要让eval(repr(x))==x为真。如果__str__()没有被定义,那么就会使用__repr__()来代替输出。2. 自定义字符串的格式化如果format时传入对象,会默认执行对象的__format__方法,如果在__format__函数中提供参原创 2021-04-24 00:59:59 · 257 阅读 · 0 评论 -
Python Cookbook3 (7)函数
1. 任意数量的位置参数和关键字参数关键字参数必须全部在位置参数后面def anyargs(*args, **kwargs): print(args) # A tuple print(kwargs) # A dict2. 强制使用关键字参数def recv(maxsize, *, block): 'Receives a message' passrecv(1024, True) # TypeErrorrecv(1024, block=True) # Ok原创 2021-04-24 00:59:05 · 109 阅读 · 0 评论 -
Python Cookbook3 (4)迭代器与生成器
1. 手动遍历迭代器# 捕获迭代终止异常a = [1,2,3]it = iter(a)try: while True: ch = next(it) print(ch)except StopIteration: print("结束")# 为迭代失败设置异常值a = [1,2,3]it = iter(a)ch = Truewhile ch: ch = next(it,None) print(ch)对于返回的StopIter原创 2021-04-24 00:58:22 · 124 阅读 · 0 评论 -
Python Cookbook3 (3)数字日期和时间
1. 数字的舍入使用round函数。round 函数返回离它最近的偶数。也就是说,对 1.5 或者 2.5 的舍入运算都会得到 2。print(round(12.3)) # 12print(round(1.23, 1)) # 1.2print(round(1.25, 1)) # 1.2print(round(1.27, 1)) # 1.3print(round(127, -1)) # 130如果只希望输出一定的宽度(也会舍入啊?没明白区别在哪),使用format。format(1.2345原创 2021-04-24 00:57:30 · 84 阅读 · 0 评论 -
Python Cookbook3 (1) 数据结构与算法
1. 解压序列赋值给多个变量基本用法很简单,注意的是这种解压赋值可以用在任何可迭代对象上面,而不仅仅是列表或者元组。 包括字符串, 文件对象, 迭代器和生成器。a, b, c = "abc"x1, x2, x3 = range(3) # 我也不知道这有啥用2. 解压可迭代对象赋值给多个变量扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象而设计的。星号表达式在迭代元素为可变长元组的序列时是很有用的。星号表达式一定可以得到一个列表,即使没有元素分配给他。data = (原创 2021-04-24 00:56:15 · 206 阅读 · 1 评论