Python 分析(检测 CPU 和内存瓶颈)

2023-10-13

您是否一直在代码中处理包含大量数据的数据集,并且一旦执行代码,您就会发现代码需要很长时间才能产生最终输出?

嗯,这可能会令人沮丧!您可能使用了正确的语法,并且逻辑也是正确的。然而,该代码会消耗大量 RAM,并且执行时间过长。

这时您应该考虑优化代码以更好地利用 CPU 资源。查找原因并定位其发生位置对于确定最佳解决方案极为重要。

在这种情况下,你会采取什么方法?您是否会使用点击和试用方法来试验您的代码,以找到代码中消耗最大资源的位置?

这是一种方法,但肯定不是最好的方法。 Python 为我们提供了令人惊奇的工具,称为分析器,它通过检测代码中导致整体代码性能不佳的确切区域,使我们的生活变得轻松。

简而言之,分析是指详细统计代码使用的不同资源以及代码如何使用这些资源。

在本教程中,我们将深入研究众多分析器,并学习如何可视化代码中的瓶颈,这将使我们能够识别问题以优化和增强代码的性能。

 

 

什么是剖析?

如果程序消耗过多 RAM 或执行时间过长,则有必要找出代码整体性能障碍背后的原因。

这意味着您需要确定代码的哪一部分阻碍了性能。

您可以通过优化您认为是造成瓶颈的主要原因的代码部分来解决问题。但通常情况下,您可能最终会修复代码中的错误部分,以试图疯狂猜测问题的位置。

您不应简单地寻找问题的中心,而应选择确定性方法,以帮助您找到导致性能障碍的确切资源。

这就是分析的用武之地。

分析使您能够以最小的努力找到代码中的瓶颈,并允许您优化代码以获得最大的性能增益。

分析的最佳部分是可以分析任何可测量的资源(不仅仅是 CPU 时间和内存)。

例如,您还可以测量网络带宽和磁盘 I/O。在本教程中,我们将重点在 Python 分析器的帮助下优化 CPU 时间和内存使用。

因此,事不宜迟,让我们深入研究 Python 提供的众多方法来对 Python 程序执行确定性分析。

 

使用时间模块

Python 提供了大量的选项来测量代码的 CPU 时间。其中最简单的是时间模块。让我们考虑一下我们的代码需要花费大量的时间来执行。

您可以在此处使用计时器来计算代码的执行时间并不断对其进行动态优化。定时器非常容易实现,并且几乎可以在代码中的任何地方使用。

例子:在下面的代码片段中,我们将查看一段非常简单的代码,它测量代码执行一个简单函数所花费的时间。


import time
def linear_search(a, x):
   for i in range(len(a)):
       if a[i] == x:
           return i
   return -1
start = time.time()
print(linear_search([10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 50))
stop = time.time()
print("Time Consumed: {} secs".format(stop - start))
  

Output:

解释:在上面的代码中,我们对给定列表实现了线性搜索,并使用函数搜索该列表中的特定数字。

time 模块的 time() 方法允许我们通过跟踪执行整个 Linear_search() 函数所花费的时间来跟踪执行这段代码所需的时间。

在这种情况下,开始时间和停止时间之间的差异是函数计算输出的实际时间。

因此,它让我们清楚地了解使用 Linear_search 函数搜索列表中的元素所需的时间。

讨论:考虑到列表的长度,这是一种超快速的搜索机制;因此这不是一个大问题。然而,想象一个由数千个数字组成的巨大列表。

那么,在这种情况下,就代码消耗的时间而言,这种搜索技术可能不是最好的算法。

因此,这是另一种方法,可以帮助搜索相同的元素,但需要更少的时间,从而允许我们优化代码。

我们将再次借助 time.time() 函数检查经过的时间,以比较两个代码所花费的时间。


import time
def binary_search(a, x):
   low = 0
   high = len(a) - 1
   mid = 0
   while low <= high:
       mid = (high + low) // 2
       if a[mid] < x:
           low = mid + 1
       elif a[mid] > x:
           high = mid - 1
       else:
           return mid
   return -1
start = time.time()
print(binary_search([10, 20, 30, 40, 50, 60, 70, 80, 90, 100], 50))
stop = time.time()
print("Time Consumed: {} secs".format(stop - start))
  

Output:

当我们比较两个输出时,很明显二分搜索比线性搜索方法消耗的时间更少。

因此,time.time() 函数使我们能够跟踪代码从列表中搜索特定元素所花费的时间,这使我们能够在最佳搜索算法的帮助下提高代码的性能。

 

使用cProfile

虽然 time 模块帮助我们跟踪代码达到最终输出所需的时间,但它并没有为我们提供太多信息。

我们必须通过手动分析代码来比较每种算法所花费的时间,从而确定最佳解决方案。

但是,在您的代码中有时会需要某些其他参数的帮助来确定代码的哪一部分导致了最大延迟。

这时您可以使用 cProfile 模块。 cProfile 是 Python 中的内置模块,通常用于执行分析。

它不仅提供代码执行所花费的总时间,而且还显示每个步骤所花费的时间。

反过来,这使我们能够比较和定位实际需要优化的代码部分。

使用cProfile的另一个好处是,如果代码中有大量函数调用,它会显示每个函数被调用的次数。

事实证明,这有助于优化代码的不同部分。

Note: cProfile 通过 cProfile.run(statement, filename=None, sort=-1) 函数帮助我们对代码执行分析。

在语句参数中,您可以传递要分析的代码或函数名称。如果您希望将输出保存到某个文件,则可以将该文件的名称传递给 filename 参数。

sort 参数用于指定输出的打印顺序。让我们看一个利用 cProfile 模块显示 CPU 使用统计信息的示例。


import cProfile
def build():
   arr = []
   for a in range(0, 1000000):
       arr.append(a)
def deploy():
   print('Array deployed!')
def main():
   build()
   deploy()
if __name__ == '__main__':
   cProfile.run('main()')
  

Output: 

解释:

    • 显示输出后,cProfile 显示的下一个信息是代码中发生的函数调用次数以及执行这些函数调用所需的总时间。
    • 下一条信息是“Ordered by: standard name”,它表示最右列中的字符串用于对输出进行排序。

表的列标题包含以下信息:

    • ncalls:代表呼叫次数。
    • tottime:表示函数所花费的总时间。它不包括调用子函数所花费的时间。
    • 每次调用:(tottime)/(ncalls)
    • cumtime:表示函数所花费的总时间以及父函数调用子函数所花费的时间。
    • percall: (cumtime)/(原始调用)
    • filename:lineno(function):给出每个函数各自的数据。

 

可以通过在 build() 方法本身中打印输出来对此代码进行轻微改进。这将减少单个函数调用,并帮助我们稍微提高代码的执行时间。

借助嵌套函数可以更好地可视化这一点。因此,让我们可视化分析对于嵌套函数的重要性。

 

分析嵌套函数

让我们对嵌套函数实现分析,即一个函数调用另一个函数来可视化 cProfile 如何帮助我们优化代码。


import cProfile
def build():
   arr = []
   for a in range(0, 1000000):
       if check_even(a):
           arr.append(a)
def check_even(x):
   if x % 2 == 0:
       return x
   else:
       return None
if __name__ == '__main__':
   cProfile.run('build()')

  

Output: 

上面的 cProfile 报告清楚地表明 check_even 方法已被调用 1000000 次。这是不必要的,并且会影响我们代码的性能。

因此,我们可以通过消除此函数调用并在循环本身内执行所需的检查来优化代码,如下面的代码片段所示。


import cProfile
def build():
   arr = []
   for a in range(0, 1000000):
       if a % 2 == 0:
           arr.append(a)
if __name__ == '__main__':
   cProfile.run('build()')

  

Output: 

我们成功地消除了代码中不必要的函数调用,从而显着提高了代码的整体性能。

 

使用 GProf2Dot 可视化分析

识别瓶颈的最佳方法之一是可视化性能指标。 GProf2Dot 是一个非常有效的工具,可以可视化我们的分析器生成的输出。

Example:假设我们正在分析以下代码片段:


import cProfile
import pstats
def build():
    arr = []
    for a in range(0, 1000000):
        arr.append(a)
if __name__ == '__main__':
    profiler = cProfile.Profile()
    profiler.enable()
    build()
    profiler.disable()
    stats=pstats.Stats(profiler).sort_stats(-1)
    stats.print_stats()
    stats.dump_stats('output.pstats')
  

安装
您必须使用 pip 来安装 gprof2dot:


pip install gprof2dot  

注意:要可视化图表,您必须确保已安装 Graphviz。您可以从以下链接下载:https://graphviz.org/download/

 

生成 pstats 文件
完成所需库的安装后,您可以使用以下命令分析脚本以生成 pstats 文件:


python -m cProfile -o output.pstats demo.py  

 

可视化统计数据
在 pstats 输出文件所在的终端中执行以下命令:


gprof2dot -f pstats output.pstats | "C:\Program Files\Graphviz\bin\dot.exe" -Tpng -o output.png
  

就这样。您会发现在同一目录中生成了一个 PNG 文件,如下所示:

注意:在 Windows 中从 pstats 文件创建图表时,您可能会遇到特殊错误。因此,最好使用点文件的完整路径,如上所示。

 

使用snakeviz可视化分析

可视化 pstats 输出的另一种令人难以置信的方法是使用 Snakeviz 工具,它可以让您清楚地了解资源的利用情况。您可以使用 pip 安装程序来安装它:“pip install Snakeviz”。

安装snakeviz工具后,您需要从命令行执行代码并生成.prof文件。生成 .prof 文件后,您必须执行以下命令才能在浏览器上可视化统计信息:


snakeviz demo.prof  

Example:在下面的代码中,我们将可视化嵌套函数如何消耗资源。


def build():
   arr = []
   for a in range(0, 1000000):
       if check_even(a):
           arr.append(a)
def check_even(x):
   if x % 2 == 0:
       return x
   else:
       return None
build()
  

To visualize the output using snakeviz, use the following command on your terminal.

Snakeviz 展示了两种可视化风格:冰柱和旭日。默认样式为Icicle,其中不同部分代码消耗的时间以矩形的宽度表示。

而在旭日视图的情况下,它由弧的角度范围表示。让我们看一下上面代码的冰柱和旭日视图。

图 1 – SnakeViz 冰柱视图

 

 

图 2 – SnakeViz Sunburst 视图

 

Python 线路分析器

CProfiler 允许我们检测代码中每个函数消耗了多少时间,但它不提供代码中每一行所花费时间的信息。

有时,仅在函数调用级别进行分析并不能解决问题,因为当从代码的不同部分调用某个函数时,它会导致混乱。

例如,该函数可能在 call#1 下执行良好,但会降低 call#2 下的性能。这无法通过功能级别分析来识别。

因此,Python 提供了一个名为 line_profiler 的库,它使我们能够对代码执行逐行分析。

在下面的示例中,我们将直观地展示如何从 shell 使用 line_profiler。给定的代码片段有一个 main() 函数,该函数调用其他三个函数。

主函数调用的每个函数都会生成 100000 个随机数并打印它们的平均值。

每个函数中的 sleep() 方法可确保每个函数花费不同的时间来完成操作。

为了能够可视化行分析器生成的输出,我们为脚本中的每个函数使用了 @profile 装饰器。


import time
import random
def method_1():
   time.sleep(10)
   a = [random.randint(1, 100) for i in range(100000)]
   res = sum(a) / len(a)
   return res
def method_2():
   time.sleep(5)
   a = [random.randint(1, 100) for i in range(100000)]
   res = sum(a) / len(a)
   return res
def method_3():
   time.sleep(3)
   a = [random.randint(1, 100) for i in range(100000)]
   res = sum(a) / len(a)
   return res
def main_func():
   print(method_1())
   print(method_2())
   print(method_3())
main_func()

  

我们可以使用以下命令来执行并分析上面的代码片段:


kernprof -l demo_line_profiler.py  

注意:您必须先安装线路分析器,然后才能在其帮助下执行逐行分析。要安装它,请使用以下命令:


pip install line-profiler  

kernprof 命令在完成对整个脚本的分析后会生成 script_name.lprof 文件。 .lprof 文件被创建并驻留在同一项目文件夹中。

现在,在终端中执行以下命令以可视化输出:


python -m line_profiler demo_line_profiler.py.lprof  

从上面的输出可以明显看出,线路分析器已为每个函数生成了一个表。让我们了解一下表中每一列的含义。
1. 点击次数表示该函数内特定行被点击的次数。
2. 时间表示该特定线路执行所有命中所花费的时间。
3. Per Hit 表示每次函数调用完成该行所花费的总时间。
4. % Time 表示该行所花费的时间与该函数所花费的总时间相比的百分比。
5. Line Content 代表函数的一行。

 

使用 Pyinstrument

Pyinstrument 是一个统计 Python 分析器,与 cProfile 非常相似。但与 cProfile 分析器相比,它具有一定的优势。
1.它不会一次记录整个函数调用堆栈。相反,它每 1 毫秒记录一次调用堆栈。这反过来又有助于减少分析开销。
2. 它比 cProfile 更简洁,因为它只显示花费最多时间的主要函数。因此,它消除了较快的段并避免了分析噪声。

使用 Pyinstrument 的另一个巨大优势是可以通过多种方式可视化输出,包括 HTML。您甚至可以查看完整的通话时间线。

然而,使用 Pyinstrument 的一个主要缺点是它在处理多线程中运行的代码时效率不高。

示例:在下面的脚本中,我们将生成几个随机数并求它们的总和。然后我们将把总和附加到一个列表中并返回它。
注意:您必须使用以下命令安装 Pyinstrument:


pip install pyinstrument  

 


import random
def addition(x, y):
   return x + y
def sum_list():
   res = []
   for i in range(1000000):
       num_1 = random.randint(1, 100)
       num_2 = random.randint(1, 100)
       add = addition(num_1, num_2)
       res.append(add)
   return res
if __name__ == "__main__":
   o = sum_list()
  

我们可以使用以下命令执行代码以可视化 pyinstrument 输出:


pyinstrument demo_pyinstrument.py  

 

使用雅皮

另一种 Python 分析器,缩写为 Yappi,是用 C 语言设计的 Python 分析器。它支持多线程代码的分析。它执行功能级分析。

它还允许我们以多种格式格式化分析输出,例如 callgrind 和 pstat。

Yappi 利用我们的能力来决定是否要分析 CPU 时间或挂起时间。

CPU 时间是代码使用 CPU 所花费的总时间,而 walltime 是代码运行的时间,从第一行到最后一行。

Yappi 将输出存储为 stat 对象,使我们能够过滤分析结果并对它们进行排序。我们可以在 Yappi 的帮助下调用、启动、停止和生成分析报告。

Example:在下面的代码中,我们有一个函数,它会迭代 100000 个数字,并将每个数字加倍,然后将其附加到列表中。然后我们将使用 Yappi 对其进行分析。


def addition(x, y):
   return x+y
def sum_list():
   res = []
   for i in range(10000):
       out = addition(i, i)
       res.append(out)
   return res
if __name__ == "__main__":
   o = sum_list()

  

Output:

 

使用 Palanteer

Palanteer 是另一个分析工具,可用于分析 Python 和 C++ 代码。

因此,如果您处理包装 C++ 库的 Python 代码并且希望深入了解应用程序的组件,那么它是您的武器库中的一个强大工具。

Palanteer 使用一个 GUI 应用程序来显示结果,这使得动态跟踪和可视化统计数据非常有用。

Palanteer 跟踪几乎所有性能参数,从函数调用到操作系统级内存分配。

然而,palanteer 的问题是你必须从头开始构建它,即从源头开始构建它。它还没有预编译的二进制文件。

 

Python 内存分析器

我们已经经历了一个充满分析器和示例的世界,这些示例演示了如何分析代码以测量其执行时间。

还有其他因素(例如内存使用情况)决定了代码的性能。

因此,为了可视化代码中不同资源的内存使用情况,Python 为我们提供了一个内存分析器来测量内存使用情况。要使用内存分析器,您必须使用 pip 安装它:


pip install -U memory_profiler  

就像行分析器一样,内存分析器用于跟踪逐行内存使用情况。您必须使用 @profile 装饰器装饰每个函数以查看使用统计信息,然后使用以下命令运行脚本:


python -m memory_profiler script_name.py  

在下面的代码中,我们将在列表中存储 100000 范围内的值,然后借助内存分析器可视化内存使用情况。


@profile
def foo():
   li = []
   for i in range(100000):
       li.append(i)
foo()
  

Output:

 

蟒蛇Pympler

在许多情况下,需要借助对象来监视内存使用情况。这时,称为 pympler 的 Python 库就可以方便地满足要求。

它为我们提供了以各种方式监视内存使用情况的模块列表。

在本教程中,我们将了解assizeof接受一个或多个对象作为输入并返回每个对象的大小(以字节为单位)的模块。
注意:使用之前必须安装 pympler:


pip install Pympler  

示例:在下面的代码中,我们将创建几个列表并存储两个不同范围内的值,然后使用 pympler 库的 asizeof 模块找出每个列表对象占用的大小。


from pympler import asizeof
li_1 = [x for x in range(100)]
li_2 = [y for y in range(100000)]
print("Space occupied by li_1 : %d bytes"%asizeof.asizeof(li_1))
print("Space occupied by li_2 : %d bytes"%asizeof.asizeof(li_2))
print("Space occupied by li_1 + li_2: %d bytes"%asizeof.asizeof(li_1,li_2))
  

Output:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 分析(检测 CPU 和内存瓶颈) 的相关文章

  • 如何在 Matplotlib 中指定类似箭头的线条样式?

    我想在 Matplotlib 中显示一组 xy 数据 以指示特定路径 理想情况下 将修改线条样式以使用类似箭头的补丁 我创建了一个模型 如下所示 使用 Omnigraphsketcher 看来我应该能够覆盖常见的之一linestyle声明
  • 如何有效地将多个 pandas 列组合成一个类似数组的列?

    使用对象类型列之类的东西创建 或加载 DataFrame 很容易 如下所示 In pdf pd DataFrame a 1 2 3 b 4 5 6 c 7 8 9 combined 1 4 7 2 5 8 3 6 9 Out a b c c
  • Python:文本覆盖在所有窗口顶部,包括 Linux 中的全屏

    我正在尝试用 python 编写一个简单的脚本 在所有窗口和全屏应用程序之上输出文本 该脚本的目的是以类似于 Steam FPS 计数器工作方式的方式输出平均负载和可用内存 以及其他有用的统计数据 到目前为止 我尝试了 pygame 但据我
  • tf.print 什么时候才能真正按预期工作(即打印张量和变量的值)?

    首先 我使用的是TensorFlow 2 0 我只关心这个版本或更高版本 而且我已经太关心这样一个只会产生头痛的软件了 The TensorFlow 文档 https www tensorflow org api docs python t
  • for 循环遍历单词

    我之前的帖子引起了很多混乱 其中充斥着与我的问题无关的答案 我的错是没有澄清事情 我标记了该帖子 这是新帖子 所以基本上我想做一个单词的连接 EG1 input jason sonny nyorth output jason sonny n
  • Python sqlalchemy 尝试使用 .to_sql 将 pandas 数据帧写入 SQL Server

    我有一个Python代码 通过它我得到了一个pandas数据框 df 我正在尝试将此数据框写入 Microsoft SQL 服务器 我尝试通过以下代码进行连接 但出现错误 import pyodbc from sqlalchemy impo
  • 在python中查找文件

    我有一个文件可能位于每个用户计算机上的不同位置 有没有办法实现文件的搜索 我可以传递文件名和目录树进行搜索的方法吗 os walk http docs python org library os html os walk就是答案 这将找到第
  • ConfigParser 从 INI 文件中获取值,如下所示

    我有以下类型的 INI 文件 section1 subsection1 port 989 section1 subsection2 somethign somethign 我正在使用 Python 的 ConfigParser 来解析 IN
  • 在嵌套有序字典 python 中查找给定键的值

    我试图从嵌套的 OrderedDict 中查找给定键的值 关键点 我不知道这个字典会嵌套多深 我正在寻找的键的名称是不变的 它将位于字典中的某个位置 我想返回本例中名为 powerpoint color 的键的值 mydict Ordere
  • Tensorflow:使用 Adam 优化器

    我正在张量流中试验一些简单的模型 包括一个看起来与第一个非常相似的模型面向 ML 初学者的 MNIST 示例 http www tensorflow org tutorials mnist beginners index md 但维数稍大一
  • Python 单行代码

    我想要用 Python 编写以下代码的单行解决方案 但是如何实现呢 total 0 for ob in self oblist total sum v amount for v in ob anoutherob 它返回总价值 我想要它是单行
  • 绘制顶部有函数线的直方图

    我正在尝试使用 SciPy 进行统计 使用 matplotlib 进行绘图 在 Python 中进行一些分布绘图和拟合 我在创建直方图等方面运气很好 seed 2 alpha 5 loc 100 beta 22 data ss gamma
  • 在 python 中检查堆栈中的局部变量

    我编写了一个小函数 它在堆栈中查找一级并查看其中是否有变量 但是我如何将这个函数变成一个可以在堆栈中一直查找直到找到一个局部变量并购买某个特定名称的函数 import inspect def variable lookup variable
  • 请求库在 HTTPS 代理 CONNECT 上强制使用 HTTP/1.1

    我遇到了 HTTP 代理服务器行为异常的问题 不幸的是 我无法控制代理服务器 它是 IBM 的 企业 产品 代理服务器是用于软件测试的服务虚拟化解决方案的一部分 根本问题 我认为 是代理服务器发回 HTTP 1 0 响应 我可以从 SOAP
  • scikit-learn:SVC 和 SGD 有什么区别?

    SVM http scikit learn org stable modules svm html classification http scikit learn org stable modules svm html classific
  • 从一个 numpy 数组中删除另一个 numpy 数组中的元素的有效方法

    从一个 numpy 数组中删除另一个数组中的元素的最佳方法是什么 本质上我是在追求np delete 其中数组的顺序并不重要 import numpy as np a np array 2 1 3 print a b np array 4
  • 在包含一些通配符的大型列表中进行成员资格测试

    当列表包含特殊类别时 如何测试某个短语是否在大型 650k 短语列表中 例如 我想测试这个短语是否 he had the nerve 在列表中 确实如此 但是在 he had DETERMINER nerve where DETERMINE
  • 分段错误(核心转储),执行线程

    我试图在 python 中运行一个程序 该程序打开一个程序并从其标准输出中读取 当我运行程序代码时 出现分段错误错误 但是当我将代码放入函数 Myfunc 中的线程外时 它可以正常工作 我不明白发生了什么 这是我的代码 class Work
  • 带有 unicode 键的字典

    Python 中是否可以使用 Unicode 字符作为字典的键 我使用 Unicode 中的西里尔字母作为键 当尝试通过键获取值时 我得到以下回溯 Traceback most recent call last File baseCreat
  • 如何在 Flask 之外使用 jinja2 及其 i18n 扩展(使用 babel)

    如何在 Flask 应用程序之外将 jinja2 与 babel 一起使用 假设我有使用 pybabel 命令填充的语言环境目录 我想加载翻译文件并翻译我的模板文件 我找到了解决方案 以下是如何在不集成 Flask 的情况下使用 jinja

随机推荐

  • 数据科学数学

    数据科学数学 学习路径 技能 统计 相关性 线性回归 逻辑回归 在这个学习路径中 您将获得在数据科学方面取得进步所需的数学基础 其他资源 真正的 Python 数据科学主题 真正的 Python 机器学习主题 数据科学数学 学习路径 5 种
  • Python 基础练习:文件系统操作(概述)

    In Python 基础知识 文件系统操作 您学习了如何使用 Python 处理文件和文件夹 作为一名程序员 您将使用pathlib和shutil要完成的模块文件系统操作不依赖你的图形用户界面 GUI 虽然您已经进行了大量文件系统操作的实践
  • 使用 Python 和 ggplot 绘制数据图表

    在本课程中 您将学习如何使用ggplot在Python中使用创建数据可视化图形语法 图形语法是一种高级工具 可让您以高效且一致的方式创建数据图 它抽象了最底层的细节 让您专注于为数据创建有意义且美观的可视化效果 有几个 Python 包提供
  • MicroPython 入门(概述)

    您对物联网 家庭自动化和互联设备感兴趣吗 你有没有想过建造一把爆能枪 一把激光剑 甚至你自己的机器人会是什么样子 如果是这样 那么您很幸运 微Python可以帮助您完成所有这些事情以及更多 在本课程中 您将了解 这历史微Python的 这差
  • Jupyter 终端及更多

    Jupyter Notebooks 不仅可以让您启动笔记本 在本课程中 您将学习如何启动新终端以及如何在浏览器中创建文件夹或文件
  • 2021 年 8 月 11 日

    主持人大卫 阿莫斯回答会员的问题 本周 Real Python 社区经理 Andres Pineda 也加入了 David 的行列 在这次会议上 我们讨论了 Python 新闻和更新 如何开始使用 Python 进行日志记录 如何学习编写更
  • 适合 Python 程序员的 C

    目录 The C Preprocessor 包括 定义 undef if pragma 错误 Basic C Syntax for Python Programmers 一般的 if 语句 switch 语句 循环 功能 指针 弦乐 结构体
  • 关于约翰·斯特茨

    关于约翰 斯特茨 John 是一位狂热的 Python 爱好者 也是 Real Python 教程团队的成员 约翰的教程 Python 中的模字符串格式化 Python 中的递归 简介 Python 中的函数式编程 何时以及如何使用它 Py
  • pandas 排序方法入门

    有关这些视频中使用的 REPL 的更多信息 您可以查看蟒蛇以及真正的 Python 教程探索 bpython 具有类似 IDE 功能的 Python REPL
  • 漂亮的印花

    此外print Python 包括一个漂亮的印刷品方法 此方法对于以更易于阅读的格式输出有关对象的调试信息特别有用 gt gt gt gt gt gt from pprint import pprint gt gt gt data squa
  • Python 新闻:2021 年 12 月以来的新增内容

    目录 Python 指导委员会选举 Python 新版本 Python 3 6 生命周期结束 代码的出现 Python 的下一步是什么 In 2021 年 12 月 第四个Python指导委员会像往常一样 由新成员和回归成员组成 Pytho
  • 第 12 集:Python 中的网页抓取:工具、技术和合法性

    第 12 集 Python 中的网页抓取 工具 技术和合法性 真正的 Python 播客 2020年6月5日50公尺 RSS Apple Podcasts Google Podcasts Spotify More 播客瘾君子 灰蒙蒙 袖珍铸
  • 列表:有序和任意

    您已经了解了如何创建列表 在本课程中 您将了解到列表是有序的并且可以包含任意对象的集合 定义列表时使用的顺序在列表的生命周期内保持不变 包含相同元素但顺序不同的列表是不同的 gt gt gt gt gt gt a spam egg baco
  • 在“for”循环中使用 .append() 进行附加处理

    有关本课程所涵盖概念的更多信息 您可以查看 Python enumerate 简化需要计数器的循环 真正的Python文章 Python for 循环 确定迭代 真正的Python文章
  • 设计和指导:Python 中的 OOP(概述)

    编写优秀的面向对象代码不仅仅是如何编写 句法 知道何时和何时不使用它 以及指导原则 在后面面向对象设计将帮助您编写更好的代码 在本课程中 您将了解 中的面向对象方法Python 与其他语言 您的情况不应该使用Python 中的类 继承的替代
  • 使用 Sed 命令在 Linux 中追加文本

    Sed提供根据特定模式或条件将文本附加到文件中的行的能力 您可以使用a 命令输入sed在模式匹配后添加新行 让我们深入研究现实世界的示例 以了解如何有效地利用此功能 目录 hide 1 在匹配的模式后添加一行 2 在匹配的模式后追加多行 3
  • Linux Web 服务器 (Apache) 的安装、配置和故障排除

    在本教程中 我们将具体讨论 Linux Web 服务器或 Apache Web 服务器 以及如何安装和配置它以向其他人提供您的内容 Web 服务器是一个通过 HTTP 协议处理请求的系统 您向服务器请求一个文件 它会响应所请求的文件 这可能
  • 使用 Curl 命令的 RESTful API 交互

    主要用途之一curl与 RESTful API 进行交互 RESTful API 是许多现代 Web 应用程序和服务的支柱 在本教程中 您将学习如何使用 RESTful API 进行交互卷曲命令 获取数据 发布信息以及解析各种响应 目录 h
  • NumPy 数组重塑指南

    The NumPyPython 中的库提供了强大的功能来重塑数组的维度 这就是我们将在本教程中深入探讨的内容 在整个教程中 我们将介绍 NumPy 数组重塑的含义及其重要性 然后再深入研究如何重塑不同维度的数组的细节 在本教程结束时 您将熟
  • Python 分析(检测 CPU 和内存瓶颈)

    您是否一直在代码中处理包含大量数据的数据集 并且一旦执行代码 您就会发现代码需要很长时间才能产生最终输出 嗯 这可能会令人沮丧 您可能使用了正确的语法 并且逻辑也是正确的 然而 该代码会消耗大量 RAM 并且执行时间过长 这时您应该考虑优化