自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3020)
  • 收藏
  • 关注

原创 Python 高手编程系列二千九百二十五:使用 super 易犯的错误

在下面来自 James Knight 网站(http://fuhm.net/super-harmful)的示例中,C 类使用。主要原因在于类的初始化。在 Python 中,基类不会在__init__()中被隐式地调用,所以。现在回到 super。如果使用了多重继承的层次结构,那么使用 super 是非常危险的,需要由开发人员来调用它们。()调用,但这又会导致第一种错误。混用 super 与显式类调用。

2025-04-26 12:52:58 118

原创 Python 高手编程系列二千九百二十四:Python 2 中的旧式类与 super

Python 的方法解析顺序是基于 C3,这是为 Dylan 编程语言(http://opendylan.org)构建的。在早期版本的 Python 中,所有类并没有一个共同的祖先 object。这里 L[MyClass]是 MyClass 类的线性化,而 merge 是合并多个线性化结果的具体。在 Python 2 中,如果使用的是旧式类(不继承自 object),仍然存在这样的算法。例如,在(Base1,Python 所有的 2.x 版本中都保留了旧式类,目的是为了向后兼容,所以在这些版本中,如。

2025-04-26 12:52:27 368

原创 Python 高手编程系列二千九百二十三:子类化内置类型

注意,零参数的 super()形式也可用于被 classmethod 装饰器装饰的方法。super 的简化形式(不传入任何参数)可以在方法内部使用,但 super 的使用并不。的速度更快,代码更整洁。最后,关于 super 还有很重要的一点需要注意,就是它的第二个参数是可选的。前面提到的使用实例很容易理解,但如果面对多重继承模式,super 将变得难以使用。当需要实现与某个内置类型具有相似行为的类时,最好的方法就是将这个内置类型子类化。类型的共同祖先,也是所有没有显式指定父类的用户自定义类的共同祖先。

2025-04-26 12:51:56 450

原创 Python 高手编程系列二千九百二十二:函数注解

Python 3 终结了这一分歧,其开发者只能使用被称为新式类的模型。怎样,知道两种模型在 Python 2 中的工作原理仍是很重要的,因为这有助于你移植旧代码。定义好之后,注解可以通过函数对象的__annotations__属性获取,它是一个字典,分重点介绍了与 Python 序列和集合相关的语法特性,也讨论了字符串和字节相关的序列。这也是为什么本章包含关于 Python 2 旧特性的大量内容,尽管本书针对的是最新版的。自定义函数使用的类型的完全可选的元信息,但事实上,它并不局限于类型提示,而且在。

2025-04-26 12:51:15 179

原创 Python 高手编程系列二千九百二十一:元类

现在第一个位置参数的命名约定为 cls,说明它已经是一个创建好的类对象(元类的实例),而不是一个元类对象。name、bases 和 namespace 参数的含义与前面介绍的 type()调用中的参数相同,• bases:这是父类的列表,将成为__bases__属性,并用于构造新创建的类的 MRO。然是 type 类的子类(参见图 3-4),因为如果不是的话,这个类将在继承方面与其他的类。metaclass 参数的值通常是另一个类对象,但它可以是任意可调用对象,只要接受。定义了对象实例的类也是对象。

2025-04-26 12:50:44 450

原创 Python 高手编程系列二千九百二十:使用 __new __()方法覆写实例创建过程

()方法是非常合理的。那就是下一节将介绍的元类。

2025-04-26 12:50:05 314

原创 Python 高手编程系列二千九百一十九:槽

属性来为指定的类设置一个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程。不幸的是,这个问题不能用第 2 章“(4)保存内省的装饰器”一节介绍的方法(使用额外。Python 中的混入类是一种不应被初始化的类,而是用来向其他现有类提供某种可复用。虽然有这样的警告,但类装饰器仍然是对流行的混入(mixin)类模式的一种简单又轻。在类装饰器中这样使用闭包的主要缺点是,生成的对象不再是被装饰的类的实例,而是在。这种模式的框架之一。当然,上面的代码片段并不是很好的代码示例,因为其含义过于模糊。

2025-04-26 12:49:35 443

原创 Python 高手编程系列二千九百一十八:property

基于上述原因,创建 property 的最佳语法是使用 property 作为装饰器。如果需要修改property的工作方式,推荐在派生类中覆写所有的property。property 的 setter 行为的话,通常意味着也需要修改 getter 的行为。property 提供了一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。不幸的是,上面的代码有一些可维护性的问题。在大多数情况下,这是唯一的选择,因为如果修改了。是利用当前类的方法实时创建,不会使用派生类中覆写的方法。

2025-04-26 12:49:04 356

原创 Python 高手编程系列二千九百一十七:现实例子 — 延迟求值属性

描述符的一个示例用法就是将类属性的初始化延迟到被实例访问时。如果这些属性的初始化依赖全局应用上下文的话,那么这一点可能有用。另一个使用场景是初始化的代价很大,但在导入类的时候不知道是否会用到这个属性。这样的描述符可以按照如下所示来实现:defdef’)else:’)下面是示例用法:m.lazily_m.lazilycached!

2025-04-26 12:48:25 249

原创 Python 高手编程系列二千九百一十六:最佳实践

在 Python 2 中,没有指定任何祖先的类被认为是旧式类。(self, obj, value):在读取属性时将调用这一方法(被称为 getter)。幸运的是,多亏了 Python 描述符的工作方式。• super 的使用必须一致:在类的层次结构中,要么全部用 super,要么全不用。它是一个类,定义了另一个类的属性的访问方式。为了避免前面提到的所有问题,在 Python 在这个领域取得进展之前,我们需要考虑以。Python 提供这一特性是为了避免继承中的名称冲突,因为属性被重命名为以类名为前。

2025-04-26 12:47:55 314

原创 Python 高手编程系列二千九百一十五:使用 super 易犯的错误

在下面来自 James Knight 网站(http://fuhm.net/super-harmful)的示例中,C 类使用。主要原因在于类的初始化。在 Python 中,基类不会在__init__()中被隐式地调用,所以。现在回到 super。如果使用了多重继承的层次结构,那么使用 super 是非常危险的,需要由开发人员来调用它们。()调用,但这又会导致第一种错误。混用 super 与显式类调用。

2025-04-26 12:47:24 77

原创 Python 高手编程系列二千九百一十四:Python 2 中的旧式类与 super

Python 的方法解析顺序是基于 C3,这是为 Dylan 编程语言(http://opendylan.org)构建的。在早期版本的 Python 中,所有类并没有一个共同的祖先 object。这里 L[MyClass]是 MyClass 类的线性化,而 merge 是合并多个线性化结果的具体。在 Python 2 中,如果使用的是旧式类(不继承自 object),仍然存在这样的算法。例如,在(Base1,Python 所有的 2.x 版本中都保留了旧式类,目的是为了向后兼容,所以在这些版本中,如。

2025-04-26 12:46:48 366

原创 Python 高手编程系列二千九百一十三:子类化内置类型

注意,零参数的 super()形式也可用于被 classmethod 装饰器装饰的方法。super 的简化形式(不传入任何参数)可以在方法内部使用,但 super 的使用并不。的速度更快,代码更整洁。最后,关于 super 还有很重要的一点需要注意,就是它的第二个参数是可选的。前面提到的使用实例很容易理解,但如果面对多重继承模式,super 将变得难以使用。当需要实现与某个内置类型具有相似行为的类时,最好的方法就是将这个内置类型子类化。类型的共同祖先,也是所有没有显式指定父类的用户自定义类的共同祖先。

2025-04-26 12:46:15 401

原创 Python 高手编程系列二千九百一十二:函数注解

Python 3 终结了这一分歧,其开发者只能使用被称为新式类的模型。怎样,知道两种模型在 Python 2 中的工作原理仍是很重要的,因为这有助于你移植旧代码。定义好之后,注解可以通过函数对象的__annotations__属性获取,它是一个字典,分重点介绍了与 Python 序列和集合相关的语法特性,也讨论了字符串和字节相关的序列。这也是为什么本章包含关于 Python 2 旧特性的大量内容,尽管本书针对的是最新版的。自定义函数使用的类型的完全可选的元信息,但事实上,它并不局限于类型提示,而且在。

2025-04-26 12:45:34 158

原创 Python 高手编程系列二千九百一十:上下文管理器 — with 语句

为了确保即使在出现错误的情况下也能运行某些清理代码,try…finally 语句是很有用的。这一语句有许多使用场景,例如:• 关闭一个文件。• 释放一个锁。• 创建一个临时的代码补丁。• 在特殊环境中运行受保护的代码。with 语句为这些使用场景下的代码块包装提供了一种简单方法。即使该代码块引发了异常,你也可以在其执行前后调用一些代码。例如,处理文件通常采用这种方式:try:… continue…

2025-04-26 12:44:27 324

原创 Python 高手编程系列二千九百零九:缓存

缓存装饰器与参数检查十分相似,不过它重点是关注那些内部状态不会影响输出的函数。每组参数都可以链接到唯一的结果。这种编程风格是函数式编程(functional programming,参见 https://en.wikipedia.org/wiki/Functional_programming)的特点,当输入值有限时可以使用。因此,缓存装饰器可以将输出与计算它所需要的参数放在一起,并在后续的调用中直接返回它。

2025-04-25 18:47:59 518

原创 Python 高手编程系列二千九百零七:装饰器

Python 装饰器的作用是使函数包装与方法包装(一个函数,接受函数并返回其增强函数)变得更容易阅读和理解。最初的使用场景是在方法定义的开头能够将其定义为类方法或静态方法。如果不用装饰器语法的话,定义可能会非常稀疏,并且不断重复:如果用装饰器语法重写的话,代码会更简短,也更容易理解:一般语法和可能的实现装饰器通常是一个命名的对象(不允许使用lambda 表达式),在被(装饰函数)调用时接受单一参数,并返回另一个可调用对象。

2025-04-25 18:47:29 204

原创 Python 高手编程系列二千九百零六:yield 语句

在社区中,生成器并不常用,因为开发人员还不习惯这种思考方式。send 的作用和 next 类似,但会将函数定义内部传入的值变成 yield 的返回值。Python 生成器的另一个重要特性,就是能够利用 next 函数与调用的代码进行交互。基于 yield 语句,生成器可以暂停函数并返回一个中间结果。这个函数返回一个 generator 对象,是特殊的迭代器,它知道如何保存执行上下文。它可以被无限次调用,每次都会生成序列的下一个元素。实际上,它看上去就像。成它的生成器每次提供一个值,并不需要无限大的内存。

2025-04-25 18:46:58 251

原创 Python 高手编程系列二千九百零五:超越基础集合类型 — collections 模块

幸运的是,Python 标准库内置的 collections 模块提供了更多的选择。• defaultdict:字典子类,可以通过调用用户自定义的工厂函数来设置缺失值。• deque:双端队列,类似列表,是栈和队列的一般化,可以在两端快速添加或取出。法元素,我们会讲到这样的元素,它们不与任何特定的内置类型直接相关,而且在刚开始。迭代器本身是一个底层的特性和概念,在程序中可以不用它。• ChainMap:类似字典的类,用于创建多个映射的单一视图。• OrderedDict:字典子类,可以保存元素的添加顺序。

2025-04-25 18:46:27 116

原创 Python 高手编程系列二千九百零四:使用进程池

来自 multiprocessing 模块的高级抽象,例如 Pool 类,与在 threading 模块中。multiprocessing 模块最好的一点是它提供了一个即用型的 Pool 类,可以处理管理。但这并不意味着你需要牺牲 multiprocessing 模块中的所有有用的抽象,只要你想。们再看看我们的之前的例子的 main()。的情况,这是一个很大的改进。与“使用线程池”中的描述的线程方式类似,构建一个进程池,这是在依赖多进程以。这可以减少代码中的样板代码数量,并且还可以创建更多可插入的接口。

2025-04-25 18:45:55 98

原创 Python 高手编程系列二千九百零三:多进程

• 使用 multiprocessing.Queue 类,它是早先用于线程之间通信的 queue.Queue。另一种在进程之间共享状态的方法是在 multiprocessing.sharedctypes 中提供的。• 使用 multiprocessing.sharedctypes 模块,通过它可以在进程之间共享的。不幸的是,os.fork 在 Windows 下不可用,需要生成一个新的解释器以模仿 fork。称,multiprocessing 模块也暴露了类似的线程接口,所以你可能想要使用相同的接口。

2025-04-25 18:45:25 430

原创 Python 高手编程系列二千九百零二:处理错误与速率限制

在处理这些问题时,你可能会遇到的最后一个问题是外部服务提供商施加的速率限制。以使用 Google Maps API 为例,在撰写本书时,免费和未经身份验证的请求的官方费率限制为每秒 10 个请求和每天 2,500 个请求。当使用多线程时,很容易耗尽这样的限制。更严重的问题是,因为我们没有覆盖任何故障的场景,而处理多线程 Python 代码中的异常比平常更复杂。当客户端超过 Google 的速率时,api.geocode()函数将抛出异常,这是个好消息。

2025-04-25 18:44:55 379

原创 Python 高手编程系列二千九百零一:使用线程池

是用于与工作线程通信的很好的选择,它来自内置的 queue 模块。何性能改进,但实际上,我们还减少由于缓慢的 print()执行的线程串行化的风险。这里是一个修改版本的 main()函数,它只启动有限数量的工作线程,并使用。建一个严格定义大小的工作线程池,它将处理所有的并行工作,并通过一些线程安全的数。所以通常的想法是启动一些预定义数量的线程,它将从队列中消费工作项,直到完成。我们尝试解决的第一个问题是程序运行中未绑定限制的线程。我们现在能够解决的另一个问题是在线程中输出的潜在的有问题的打印。

2025-04-25 18:44:23 466

原创 Python 高手编程系列二千九百:何时应该使用多线程

受欢迎的 Python WSGI 兼容的网络服务器:Gunicorn(参考 http://gunicorn.org/)和 uWSGI(参考 https://uwsgi-docs.readthedocs.org),它们使用工作线程处理 HTTP 请求,这些工作线。进程,例如使用 subprocess 模块中的 run()函数,实际上这是在多个进程中进行工作,幸运的是,许多兼容 WSGI 的 Web 服务器允许这样的设置。如果在多线程中毫无顾忌的使用它,中可能会导致串行化,这将撤消多线程的所有好处。

2025-04-25 18:43:52 363

原创 Python 高手编程系列二千八百九十九:为什么需要并发

通过推断程序、算法或问题中的事件,我们可以说,如果它们可以被完全或部分分解为顺序无关的组件(单位),则这些事件是并发的。是完全正确的,但是它们不和 C 或 Java 一样解决同样多的问题。在 Python 中,多核 CPU 的多线程的性能优势有一些限制,我们稍后将讨。冒险(race hazard),这里可能发生意外的结果,因为每个线程运行的代码对数据的状态做。中多线程的局限性,以及使用 Python 线程作为可行解决方案时的一些常见并发问题。并发不是应用程序实现的问题,而只是程序,算法或问题的属性。

2025-04-25 18:43:11 274

原创 Python 高手编程系列二千八百九十八:非确定性缓存

非确定性函数的缓存比记忆化更复杂。事实上,由于这样的函数的每次执行可能给出不同的结果,通常无法使用先前的很长时间的值。你需要做的是判断一个缓存的值的有效时间。在定义的时间段过去之后,所存储的结果被认为是陈旧的,并且高速缓存需要通过新值来刷新。非确定性函数的缓存通常依赖于某些外部状态,这些状态在应用程序代码中很难跟踪。典型的示例组件如下。• 关系型数据库以及常用的任何类型的结构化数据存储引擎。• 通过网络连接(Web API)访问的第三方服务。• 文件系统。

2025-04-25 18:42:40 429

原创 Python 高手编程系列二千八百九十七:使用概率型数据结构

换句话说,对于同一组参数,确定性函数总是返回相同的结果,而非确定性函数可能返回随时间变化的结果。情况下,我们可以从视觉上推断出在不改变 fibonacci()函数的核心的情况下,我们将。缓存的另一个重要的使用案例是保存通过 Web 服务获得的第三方 API 的结果。正如我们所看到的,fibonacci()是一个递归函数,如果输入值大于 2,则调用自身。值的存储和取回的平均复杂度为 O(1),因此这大大降低了被记忆函数的总体复杂性。我们使用 memoize()装饰器的闭包的字典作为缓存值的简单存储。

2025-04-25 18:42:10 171

原创 Python 高手编程系列二千八百九十六:使用任务队列和延迟处理

如果你需要更简单的东西,那么 RQ(参见 http://pythonrq.org/)可能是一个很好的选择。的任务队列框架,支持多个消息服务器,也允许计划执行任务(它可以替代您的 cron 作业)。你不能简单地跳过你正在等待的答复的时间。在这种情况下,增加的响应时间可能不一定是由你的实现导致。间的主要贡献者,并且你没有其他更快的解决方案可以使用,当然,你无法进一步的加快。作时,只需将其添加到处理它的工作队列中,并立即响应接受请求的用户即可。幸运的是,已经有一些流行的工具可以用于构建分布式任务队列。

2025-04-25 18:41:39 305

原创 Python 高手编程系列二千八百九十五:namedtuple

它们的高级版本,称为元启发式(metaheuristics),提供解决数学优化问题的策略,这些问。然而,你可以从具有 O(1)平均复杂度的 get/set 操作的字典中获得相同的好处。优化的,以确保良好的性能与集合大小无关,但所提到的 O(1)复杂度实际上只是平均复杂性。实际上,namedtuple 是基于元组的,这可能也有益于它的性能。在这种情况下,namedtuple 是一个很好的类型,它结合了字典和元组的优点。例如,有已知良好的启发式和近似问题可以在合理的时间内解决非常大的 TSP 问题。

2025-04-25 18:41:02 91

原创 Python 高手编程系列二千八百九十四:使用集合模块

dict.setdefault 方法包括两个步骤(键查找和键设置),它们都具有 O(1)的复杂度,我们已经在第 2 章中的字典部分中了解过。当然,在 Python 中,由于列表类型中内部数组的过度分配,不是每个 list.append()由于有效的 append()和 pop()方法,从序列的两端以相同的速度工作,deque 是一。如果你需要执行大量的弹出、追加和插入,替代列表的 deque 可以提供实质性的性。collections 模块提供了高性能的容器类型,它可以替换内置的容器类型。

2025-04-25 18:40:29 212

原创 Python 高手编程系列二千八百九十三:简化

复杂度是通过使用 in 操作符在 result 列表中的查找引入,该操作的时间复杂度是 O(n)。表不是正确的顺序,那么对它进行排序,这是一个至少有 O(nlogn)复杂度的任务。由于 Python 中的 list 类型的实现细节,在列表中搜索特定的值并不是一个廉价的操。此外,如果你的列表已经是有序的,则可以使用 bisect 将新元素插入到该列表中,中的函数主要设计用于插入或查找给定值的插入索引,并且会保留有序序列的顺序。素的索引查找,这种线性复杂度不是特别糟糕,但如果需要许多这样的操作,它可能具有。

2025-04-24 12:04:27 187

原创 Python 高手编程系列二千八百九十二:大 O 记法

但是通过求解一个简单的 100n2>5n3 不等式,我们可以发现,当 n 小于 20 时,程序 B。但最坏的情况是 O(n),例如,在第 2 章中已经讲过,在字典中查找的平均复杂度为 O(1)。常大的输入时,程序 A 当然是更好的选择,因为它的行为更好的渐近。少个元素,它被认为是常数,而在特定元素个数的列表中进行查找的时间复杂度是 O(n)。例如,看一个这样的操作,将一个元素追加到 Python 的列表类型的实例。为了获取算法的性能与输入数据的大小相关的概述,手动计算它的大 O 记法是最佳的。

2025-04-24 12:03:56 203

原创 Python 高手编程系列二千八百九十一:降低复杂度

一些复杂度指标可以提供代码行为的客观信息,并且sqc 这样的信息有时可以用来推测性能的预期。在 Python 中,测量 McCabe 的复杂度是相对简单的,因为它可以从它的抽象语法树中推。试使用不同的分析策略或工具,或从不同的角度(内存、I/O 操作或网络吞吐量)查看它。执行时间或资源消耗没有实质性的影响,分析并优化这些小组件,需要花费大量的时间,如果你的应用程序似乎没有真正的瓶颈,有可能是你错过了一些东西。码分析,代码分析在查找性能瓶颈的时很有必要。它是一个源代码的指标,因此可以使用适当的工具进行测量。

2025-04-24 12:03:25 250

原创 Python 高手编程系列二千八百九十:分析网络使用情况

正如我前面所说,与第三方程序(如数据库、缓存、Web 服务或 LDAP 服务器)通信的应用程序可能会在这些应用程序运行缓慢时放慢速度。在应用程序端使用常规代码分析方法可以进行跟踪。但是,如果第三方软件自己工作正常,那么罪魁祸首可能是网络。问题可能是配置错误的集线器,低带宽网络链路,或甚至是大量的使计算机多次发送相同的数据包的流量冲突。这里有几个元素,你应该收集一下。要了解发生了什么,首先要研究以下 3 个领域:• 使用以下工具观察网络流量。

2025-04-24 12:02:53 492

原创 Python 高手编程系列二千八百八十九:分析内存使用

• Pympler(http://pythonhosted.org/Pympler/):该库声明支持 Python 2.5,2.6,2.7,3.1,3.2,3.3。objgraph(参考 http://mg.pov.lt/objgraph/)是一个简单的工具,用于创建对象引用的。不幸的是,在使用 Python/C API 的 C 扩展中,引用计数的管理必须使用 Py_INCREF()尽管相当吓人,看似复杂,Python 中的内存管理有着非常好的文档(参考 https://docs.

2025-04-24 12:02:22 421

原创 Python 高手编程系列二千八百八十八:微观分析

这在应用程序上下文之外非常有用,在命令提示符中,例如,在现有应用程序中使用不是很方便。种用法设计的一些较小的 CPython 微优化,它最终会导致二次的运行时间。这种方法当然不是理想的并且 100%准确的,但是它至少比以硬编码的执行时间断言更好,timeit 提供一种简单的方法来测量小代码片段的执行时间,它使用主机系统提供的。优化时,他们将能够在测试中设置其最大执行时间,并确保它不会被进一步的更改所破坏。短代码,但它也会让你很容易犯下危险的错误,这将导致令人困惑的结论。由此,函数所花费的时间可以转换为。

2025-04-24 12:01:34 322

原创 Python 高手编程系列二千八百八十七:扩展硬件

用 pip 下载这个简单的脚本,只要 Graphviz(参见 http://www.graphviz.org/)安装在你的。的输出,而且可以从多个其他分析文件中(如 Linux perf,xperf,gprof,Java HPROF 等)• cProfile:这是一个 C 实现,提供与 profile 工具相同的接口,但具有较少的开销。要以某种方式扩展分析器,那么 profile 可能会是一个更好的选择,因为它不使用 C 扩展。此外,高效的硬件是非常昂贵的(收益递减规律),因此这种方法也存在经济上的限。

2025-04-24 12:01:01 401

原创 Python 高手编程系列二千八百八十六:首先要能工作

只要你坚持使用 Python 化的语法,这些语法在第 2 章和第 3 章中提到过,你的代码应该是。即使 Python 试图使常见的代码模式是最快的,优化工作可能也会混淆你的代码,使代。当你达到了 90%的优化目标,剩下的 10%将使你的代码完全不可读,那么你最好停止。此外,如果有一个很好的库可以满足你的需求,你就没必要重新。设计文档应提供所有交互和每个连接的性质的设计图,从中可以获得系统的整体架构,这是没有意义的,因为真正的。应用程序通常由非常复杂的交互组成,并且,在真正使用它之前,我们不可能全面的。

2025-04-24 12:00:31 213

原创 Python 高手编程系列二千八百八十五:文档驱动开发

说,这个 doctest 也是一个很好的文档,所以,应该发自内心地改变对 doctest 的用法。稍后,doctest 将演变以考虑新的元素或所需的变化。所以,doctests 和常规测试之间的平衡是一个饱受争议的问题,这取决于由团队,可读的和可用的,所以,它们可以是包文档的一部分,而那些不可读的,只是用于构建并。由于我们已经知道如何构建、打包和测试软件,在接下来的两章中,我们将关注如何。本章是关于优化的,并且提供一套一般原则和分析技术。“我们应该忘记小的效能,大约 97%的情况:过早优化是万恶之源。

2025-04-24 11:59:57 820

原创 Python 高手编程系列二千八百八十四:测试环境与依赖兼容性

环境隔离的重要性在本书中已经提到很多次了。通过在应用程序级(虚拟环境)和系统级(系统虚拟化)上隔离执行环境,你可以确保测试可以在可重复的条件下运行。这样,你可以避免受因破坏依赖关系导致的罕见且模糊的问题。正确隔离测试环境的最佳方法是使用支持系统虚拟化的持续集成系统。对于开源项目有很好的免费解决方案,如 Travis CI(Linux 和 OS X)或 AppVeyor(Windows),但是如果你需要这样的东西来测试私有的软件,很可能你需要花一些时间,在一些现有的开源 CI。

2025-04-24 11:59:17 631

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除