知行编程网知行编程网  2022-07-26 01:00 知行编程网 隐藏边栏 |   抢沙发  23 
文章评分 0 次,平均分 0.0
来源:机器之心


当使用 pandas 操作小规模数据(低于 100 MB)时,性能一般不是问题。而当面对更大规模的数据(100 MB 到数 GB)时,性能问题会让运行时间变得更漫长,而且会因为内存不足导致运行完全失败。
 
尽管 Spark 这样的工具可以处理大型数据集(100 GB 到数 TB),但要完全利用它们的能力,往往需要更加昂贵的硬件。而且和 pandas 不同,它们缺少丰富的用于高质量数据清理、探索和分析的功能集。对于中等规模的数据,我们最好能更充分地利用 pandas,而不是换成另一种工具。
 
在这篇文章中,我们将了解 pandas 的内存使用,以及如何只需通过为列选择合适的数据类型就能将 dataframe 的内存占用减少近 90%。

Pandas 骚操作:如何将运行内存占用降低 90%!

处理棒球比赛日志
 
我们将处理 130 年之久的美国职业棒球大联盟(MLB)比赛数据,这些数据来自 Retrosheet:http://www.retrosheet.org/gamelogs/index.html。
 
这些数据原来分成了 127 个不同的 CSV 文件,但我们已经使用 csvkit 合并了这些数据,并在第一行增加了列名称。如果你想下载本文所用的这个数据版本,请访问:https://data.world/dataquest/mlb-game-logs。
 
让我们首先导入数据,并看看其中的前五行:
<section><span style="font-weight: bold;line-height: 26px;">import</span> pandas <span style="font-weight: bold;line-height: 26px;">as</span> pd<br  /><br  />gl = pd.read_csv(<span style="color: rgb(221, 17, 68);line-height: 26px;">'game_logs.csv'</span>)<br  />gl.head()</section>
下面我们总结了一些重要的列,但如果你想了解所有的列,我们也为整个数据集创建了一个数据词典:https://data.world/dataquest/mlb-game-logs/workspace/data-dictionary。

  • date - 比赛时间

  • v_name - 客队名

  • v_league - 客队联盟

  • h_name - 主队名

  • h_league - 主队联盟

  • v_score - 客队得分

  • h_score - 主队得分

  • v_line_score - 客队每局得分排列,例如:010000(10)00.

  • h_line_score - 主队每局得分排列,例如:010000(10)0X.

  • park_id - 比赛举办的球场名

  • attendance- 比赛观众

 
我们可以使用 DataFrame.info() 方法为我们提供关于 dataframe 的高层面信息,包括它的大小、数据类型的信息和内存使用情况。

默认情况下,pandas 会近似 dataframe 的内存用量以节省时间。因为我们也关心准确度,所以我们将 memory_usage 参数设置为 'deep',以便得到准确的数字。
<section>gl.info(memory_usage=<span style="color: rgb(221, 17, 68);line-height: 26px;">'deep'</span>)<br  /></section>
<section><<span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">class</span> '<span style="color: rgb(68, 85, 136);font-weight: bold;line-height: 26px;">pandas</span>.<span style="color: rgb(68, 85, 136);font-weight: bold;line-height: 26px;">core</span>.<span style="color: rgb(68, 85, 136);font-weight: bold;line-height: 26px;">frame</span>.<span style="color: rgb(68, 85, 136);font-weight: bold;line-height: 26px;">DataFrame</span>'><br  /><span style="color: rgb(68, 85, 136);font-weight: bold;line-height: 26px;">RangeIndex</span>:</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">171907</span> entries, <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span> to <span style="color: rgb(0, 128, 128);line-height: 26px;">171906</span><br  />Columns: <span style="color: rgb(0, 128, 128);line-height: 26px;">161</span> entries, date to acquisition_info<br  />dtypes: float64(<span style="color: rgb(0, 128, 128);line-height: 26px;">77</span>), int64(<span style="color: rgb(0, 128, 128);line-height: 26px;">6</span>), object(<span style="color: rgb(0, 128, 128);line-height: 26px;">78</span>)<br  />memory usage: <span style="color: rgb(0, 128, 128);line-height: 26px;">861.6</span> MB</section>
我们可以看到,我们有 171,907 行和 161 列。pandas 会自动为我们检测数据类型,发现其中有 83 列数据是数值,78 列是 object。object 是指有字符串或包含混合数据类型的情况。

为了更好地理解如何减少内存用量,让我们看看 pandas 是如何将数据存储在内存中的。

dataframe 的内部表示
 
在 pandas 内部,同样数据类型的列会组织成同一个值块(blocks of values)。这里给出了一个示例,说明了 pandas 对我们的 dataframe 的前 12 列的存储方式。

Pandas 骚操作:如何将运行内存占用降低 90%!

你可以看到这些块并没有保留原有的列名称。这是因为这些块为存储 dataframe 中的实际值进行了优化。pandas 的 BlockManager 类则负责保留行列索引与实际块之间的映射关系。它可以作为一个 API 使用,提供了对底层数据的访问。不管我们何时选择、编辑或删除这些值,dataframe 类和 BlockManager 类的接口都会将我们的请求翻译成函数和方法的调用。
 
在 pandas.core.internals 模块中,每一种类型都有一个专门的类。pandas 使用 ObjectBlock 类来表示包含字符串列的块,用 FloatBlock 类表示包含浮点数列的块。对于表示整型数和浮点数这些数值的块,pandas 会将这些列组合起来,存储成 NumPy ndarray。NumPy ndarray 是围绕 C 语言的数组构建的,其中的值存储在内存的连续块中。这种存储方案使得对值的访问速度非常快。
 
因为每种数据类型都是分开存储的,所以我们将检查不同数据类型的内存使用情况。首先,我们先来看看各个数据类型的平均内存用量。
<section><span style="font-weight: bold;line-height: 26px;">for</span> dtype <span style="font-weight: bold;line-height: 26px;">in</span> [<span style="color: rgb(221, 17, 68);line-height: 26px;">'float'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'int'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'object'</span>]:<br  />    selected_dtype = gl.select_dtypes(include=[dtype])<br  />    mean_usage_b = selected_dtype.memory_usage(deep=<span style="color: rgb(0, 128, 128);line-height: 26px;">True</span>).mean()<br  />    mean_usage_mb = mean_usage_b / <span style="color: rgb(0, 128, 128);line-height: 26px;">1024</span> ** <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span><br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">"Average memory usage for {} columns: {:03.2f} MB"</span>.format(dtype,mean_usage_mb))<br  /></section>
<section>Average memory usage <span style="font-weight: bold;line-height: 26px;">for</span> float columns: <span style="color: rgb(0, 128, 128);line-height: 26px;">1.29</span> MB<br  />Average memory usage <span style="font-weight: bold;line-height: 26px;">for</span> int columns: <span style="color: rgb(0, 128, 128);line-height: 26px;">1.12</span> MB<br  />Average memory usage <span style="font-weight: bold;line-height: 26px;">for</span> object columns: <span style="color: rgb(0, 128, 128);line-height: 26px;">9.53</span> MB</section>
可以看出,78 个 object 列所使用的内存量最大。我们后面再具体谈这个问题。首先我们看看能否改进数值列的内存用量。

理解子类型(subtype)
 
正如我们前面简单提到的那样,pandas 内部将数值表示为 NumPy ndarrays,并将它们存储在内存的连续块中。这种存储模式占用的空间更少,而且也让我们可以快速访问这些值。因为 pandas 表示同一类型的每个值时都使用同样的字节数,而 NumPy ndarray 可以存储值的数量,所以 pandas 可以快速准确地返回一个数值列所消耗的字节数。
 
pandas 中的许多类型都有多个子类型,这些子类型可以使用更少的字节来表示每个值。比如说 float 类型就包含 float16、float32 和 float64 子类型。类型名称中的数字就代表该类型表示值的位(bit)数。比如说,我们刚刚列出的子类型就分别使用了 2、4、8、16 个字节。下面的表格给出了 pandas 中最常用类型的子类型:

Pandas 骚操作:如何将运行内存占用降低 90%!

一个 int8 类型的值使用 1 个字节的存储空间,可以表示 256(2^8)个二进制数。这意味着我们可以使用这个子类型来表示从 -128 到 127(包括 0)的所有整数值。
 
我们可以使用 numpy.iinfo 类来验证每个整型数子类型的最大值和最小值。举个例子:
<section><span style="font-weight: bold;line-height: 26px;">import</span> numpy <span style="font-weight: bold;line-height: 26px;">as</span> np<br  />int_types = [<span style="color: rgb(221, 17, 68);line-height: 26px;">"uint8"</span>, <span style="color: rgb(221, 17, 68);line-height: 26px;">"int8"</span>, <span style="color: rgb(221, 17, 68);line-height: 26px;">"int16"</span>]<br  /><span style="font-weight: bold;line-height: 26px;">for</span> it <span style="font-weight: bold;line-height: 26px;">in</span> int_types:<br  />    print(np.iinfo(it))</section>
<section>Machine parameters <span style="font-weight: bold;line-height: 26px;">for</span> uint8<br  />---------------------------------------------------------------<br  />min = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  />max = <span style="color: rgb(0, 128, 128);line-height: 26px;">255</span><br  />---------------------------------------------------------------<br  /><br  />Machine parameters <span style="font-weight: bold;line-height: 26px;">for</span> int8<br  />---------------------------------------------------------------<br  />min = <span style="color: rgb(0, 128, 128);line-height: 26px;">-128</span><br  />max = <span style="color: rgb(0, 128, 128);line-height: 26px;">127</span><br  />---------------------------------------------------------------<br  /><br  />Machine parameters <span style="font-weight: bold;line-height: 26px;">for</span> int16<br  />---------------------------------------------------------------<br  />min = <span style="color: rgb(0, 128, 128);line-height: 26px;">-32768</span><br  />max = <span style="color: rgb(0, 128, 128);line-height: 26px;">32767</span><br  />---------------------------------------------------------------</section>
这里我们可以看到 uint(无符号整型)和 int(有符号整型)之间的差异。这两种类型都有一样的存储能力,但其中一个只保存 0 和正数。无符号整型让我们可以更有效地处理只有正数值的列。
 
使用子类型优化数值列
 
我们可以使用函数 pd.to_numeric() 来对我们的数值类型进行 downcast(向下转型)操作。我们会使用 DataFrame.select_dtypes 来选择整型列,然后我们会对其数据类型进行优化,并比较内存用量。
<section><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># We're going to be calculating memory usage a lot,</span><br  /><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># so we'll create a function to save us some time!</span><br  /><br  /><span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">def</span> <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">mem_usage</span><span style="line-height: 26px;">(pandas_obj)</span>:</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> isinstance(pandas_obj,pd.DataFrame):<br  />        usage_b = pandas_obj.memory_usage(deep=<span style="color: rgb(0, 128, 128);line-height: 26px;">True</span>).sum()<br  />    <span style="font-weight: bold;line-height: 26px;">else</span>: <span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># we assume if not a df it's a series</span><br  />        usage_b = pandas_obj.memory_usage(deep=<span style="color: rgb(0, 128, 128);line-height: 26px;">True</span>)<br  />    usage_mb = usage_b / <span style="color: rgb(0, 128, 128);line-height: 26px;">1024</span> ** <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span> <span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># convert bytes to megabytes</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(221, 17, 68);line-height: 26px;">"{:03.2f} MB"</span>.format(usage_mb)<br  /><br  />gl_int = gl.select_dtypes(include=[<span style="color: rgb(221, 17, 68);line-height: 26px;">'int'</span>])<br  />converted_int = gl_int.apply(pd.to_numeric,downcast=<span style="color: rgb(221, 17, 68);line-height: 26px;">'unsigned'</span>)<br  /><br  />print(mem_usage(gl_int))<br  />print(mem_usage(converted_int))<br  /><br  />compare_ints = pd.concat([gl_int.dtypes,converted_int.dtypes],axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>)<br  />compare_ints.columns = [<span style="color: rgb(221, 17, 68);line-height: 26px;">'before'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'after'</span>]<br  />compare_ints.apply(pd.Series.value_counts)<br  /></section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">7.87</span> MB<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1.48</span> MB</section>

Pandas 骚操作:如何将运行内存占用降低 90%!

我们可以看到内存用量从 7.9 MB 下降到了 1.5 MB,降低了 80% 以上。但这对我们原有 dataframe 的影响并不大,因为其中的整型列非常少。
 
让我们对其中的浮点型列进行一样的操作。
<section>gl_float = gl.select_dtypes(include=[<span style="color: rgb(221, 17, 68);line-height: 26px;">'float'</span>])<br  />converted_float = gl_float.apply(pd.to_numeric,downcast=<span style="color: rgb(221, 17, 68);line-height: 26px;">'float'</span>)<br  /><br  />print(mem_usage(gl_float))<br  />print(mem_usage(converted_float))<br  /><br  />compare_floats = pd.concat([gl_float.dtypes,converted_float.dtypes],axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>)<br  />compare_floats.columns = [<span style="color: rgb(221, 17, 68);line-height: 26px;">'before'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'after'</span>]<br  />compare_floats.apply(pd.Series.value_counts)</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">100.99</span> MB<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">50.49</span> MB</section>

Pandas 骚操作:如何将运行内存占用降低 90%!

我们可以看到浮点型列的数据类型从 float64 变成了 float32,让内存用量降低了 50%。
 
让我们为原始 dataframe 创建一个副本,并用这些优化后的列替换原来的列,然后看看我们现在的整体内存用量。
<section>optimized_gl = gl.copy()<br  /><br  />optimized_gl[converted_int.columns] = converted_int<br  />optimized_gl[converted_float.columns] = converted_float<br  /><br  />print(mem_usage(gl))<br  />print(mem_usage(optimized_gl))</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">861.57</span> MB</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">804.69</span> MB</section>
尽管我们极大地减少了数值列的内存用量,但整体的内存用量仅减少了 7%。我们的大部分收获都将来自对 object 类型的优化。
 
在我们开始行动之前,先看看 pandas 中字符串的存储方式与数值类型的存储方式的比较。

数值存储与字符串存储的比较
 
object 类型表示使用 Python 字符串对象的值,部分原因是 NumPy 不支持缺失(missing)字符串类型。因为 Python 是一种高级的解释性语言,它对内存中存储的值没有细粒度的控制能力。
 
这一限制导致字符串的存储方式很碎片化,从而会消耗更多内存,而且访问速度也更慢。object 列中的每个元素实际上都是一个指针,包含了实际值在内存中的位置的「地址」。
 
下面这幅图给出了以 NumPy 数据类型存储数值数据和使用 Python 内置类型存储字符串数据的方式。


Pandas 骚操作:如何将运行内存占用降低 90%!
图片来源:https://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/
 
在前面的表格中,你可能已经注意到 object 类型的内存使用是可变的。尽管每个指针仅占用 1 字节的内存,但如果每个字符串在 Python 中都是单独存储的,那就会占用实际字符串那么大的空间。我们可以使用 sys.getsizeof() 函数来证明这一点,首先查看单个的字符串,然后查看 pandas series 中的项。
<section><span style="font-weight: bold;line-height: 26px;">from</span> sys <span style="font-weight: bold;line-height: 26px;">import</span> getsizeof<br  /><br  />s1 = <span style="color: rgb(221, 17, 68);line-height: 26px;">'working out'</span><br  />s2 = <span style="color: rgb(221, 17, 68);line-height: 26px;">'memory usage for'</span><br  />s3 = <span style="color: rgb(221, 17, 68);line-height: 26px;">'strings in python is fun!'</span><br  />s4 = <span style="color: rgb(221, 17, 68);line-height: 26px;">'strings in python is fun!'</span><br  /><br  /><span style="font-weight: bold;line-height: 26px;">for</span> s <span style="font-weight: bold;line-height: 26px;">in</span> [s1, s2, s3, s4]:<br  />    print(getsizeof(s))<br  /></section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">60</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">65</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">74</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">74</span><br  /></section>
<section>obj_series = pd.Series([<span style="color: rgb(221, 17, 68);line-height: 26px;">'working out'</span>,<br  />                          <span style="color: rgb(221, 17, 68);line-height: 26px;">'memory usage for'</span>,<br  />                          <span style="color: rgb(221, 17, 68);line-height: 26px;">'strings in python is fun!'</span>,<br  />                          <span style="color: rgb(221, 17, 68);line-height: 26px;">'strings in python is fun!'</span>])<br  />obj_series.apply(getsizeof)<br  /></section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">60</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">65</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">74</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">74</span><br  />dtype: int64</section>
你可以看到,当存储在 pandas series 时,字符串的大小与用 Python 单独存储的字符串的大小是一样的。
 
使用 Categoricals 优化 object 类型
 
pandas 在 0.15 版引入了 Categorials。category 类型在底层使用了整型值来表示一个列中的值,而不是使用原始值。pandas 使用一个单独的映射词典将这些整型值映射到原始值。只要当一个列包含有限的值的集合时,这种方法就很有用。当我们将一列转换成 category dtype 时,pandas 就使用最节省空间的 int 子类型来表示该列中的所有不同值。

Pandas 骚操作:如何将运行内存占用降低 90%!

为了了解为什么我们可以使用这种类型来减少内存用量,让我们看看我们的 object 类型中每种类型的不同值的数量。
<section>gl_obj = gl.select_dtypes(include=[<span style="color: rgb(221, 17, 68);line-height: 26px;">'object'</span>]).copy()<br  />gl_obj.describe()</section>

Pandas 骚操作:如何将运行内存占用降低 90%!
上图完整图像详见原文

大概看看就能发现,对于我们整个数据集的 172,000 场比赛,其中不同(unique)值的数量可以说非常少。
 
为了了解当我们将其转换成 categorical 类型时究竟发生了什么,我们拿出一个 object 列来看看。我们将使用数据集的第二列 day_of_week.
 
看看上表,可以看到其仅包含 7 个不同的值。我们将使用 .astype() 方法将其转换成 categorical 类型。
<section>dow = gl_obj.day_of_week<br  />print(dow.head())<br  /><br  />dow_cat = dow.astype(<span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>)<br  />print(dow_cat.head())</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>    Thu<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>    Fri<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>    Sat<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>    Mon<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>    Tue<br  />Name: day_of_week, dtype: object<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>    Thu<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>    Fri<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>    Sat<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>    Mon<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>    Tue<br  />Name: day_of_week, dtype: category<br  />Categories (<span style="color: rgb(0, 128, 128);line-height: 26px;">7</span>, object): [Fri, Mon, Sat, Sun, Thu, Tue, Wed]</section>
如你所见,除了这一列的类型发生了改变之外,数据看起来还是完全一样。让我们看看这背后发生了什么。
 
在下面的代码中,我们使用了 Series.cat.codes 属性来返回 category 类型用来表示每个值的整型值。
<section>dow_cat.head().cat.codes</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">4</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">5</span><br  />dtype: int8</section>
你可以看到每个不同值都被分配了一个整型值,而该列现在的基本数据类型是 int8。这一列没有任何缺失值,但就算有,category 子类型也能处理,只需将其设置为 -1 即可。
 
最后,让我们看看在将这一列转换为 category 类型前后的内存用量对比。
<section>print(mem_usage(dow))<br  />print(mem_usage(dow_cat))</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">9.84</span> MB<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">0.16</span> MB</section>
9.8 MB 的内存用量减少到了 0.16 MB,减少了 98%!注意,这个特定列可能代表了我们最好的情况之一——即大约 172,000 项却只有 7 个不同的值。
 
尽管将所有列都转换成这种类型听起来很吸引人,但了解其中的取舍也很重要。最大的坏处是无法执行数值计算。如果没有首先将其转换成数值 dtype,那么我们就无法对 category 列进行算术运算,也就是说无法使用 Series.min() 和 Series.max() 等方法。
 
我们应该坚持主要将 category 类型用于不同值的数量少于值的总数量的 50% 的 object 列。如果一列中的所有值都是不同的,那么 category 类型所使用的内存将会更多。因为这一列不仅要存储所有的原始字符串值,还要额外存储它们的整型值代码。你可以在 pandas 文档中了解 category 类型的局限性:http://pandas.pydata.org/pandas-docs/stable/categorical.html。
 
我们将编写一个循环函数来迭代式地检查每一 object 列中不同值的数量是否少于 50%;如果是,就将其转换成 category 类型。
<section>converted_obj = pd.DataFrame()<br  /><br  /><span style="font-weight: bold;line-height: 26px;">for</span> col <span style="font-weight: bold;line-height: 26px;">in</span> gl_obj.columns:<br  />    num_unique_values = len(gl_obj[col].unique())<br  />    num_total_values = len(gl_obj[col])<br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num_unique_values / num_total_values < <span style="color: rgb(0, 128, 128);line-height: 26px;">0.5</span>:<br  />        converted_obj.loc[:,col] = gl_obj[col].astype(<span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>)<br  />    <span style="font-weight: bold;line-height: 26px;">else</span>:<br  />        converted_obj.loc[:,col] = gl_obj[col]</section>
和之前一样进行比较:
<section>print(mem_usage(gl_obj))<br  />print(mem_usage(converted_obj))<br  /><br  />compare_obj = pd.concat([gl_obj.dtypes,converted_obj.dtypes],axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>)<br  />compare_obj.columns = [<span style="color: rgb(221, 17, 68);line-height: 26px;">'before'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'after'</span>]<br  />compare_obj.apply(pd.Series.value_counts)</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">752.72</span> MB<br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">51.67</span> MB</section>
Pandas 骚操作:如何将运行内存占用降低 90%!
在这个案例中,所有的 object 列都被转换成了 category 类型,但并非所有数据集都是如此,所以你应该使用上面的流程进行检查。
 
object 列的内存用量从 752MB 减少到了 52MB,减少了 93%。让我们将其与我们 dataframe 的其它部分结合起来,看看从最初 861MB 的基础上实现了多少进步。
<section>optimized_gl[converted_obj.columns] = converted_obj<br  /><br  />mem_usage(optimized_gl)</section>
<section><span style="color: rgb(221, 17, 68);line-height: 26px;">'103.64 MB'</span></section>
Wow,进展真是不错!我们还可以执行另一项优化——如果你记得前面给出的数据类型表,你知道还有一个 datetime 类型。这个数据集的第一列就可以使用这个类型。
<section>date = optimized_gl.date<br  />print(mem_usage(date))<br  />date.head()</section>
<pre style=""><section style=""><span style="color: rgb(0, 128, 128);line-height: 26px;">0.66</span> MB</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">18710504</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">18710505</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">18710506</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">18710508</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>    <span style="color: rgb(0, 128, 128);line-height: 26px;">18710509</span><br  />Name: date, dtype: uint32</section>
你可能记得这一列开始是一个整型,现在已经优化成了 unint32 类型。因此,将其转换成 datetime 类型实际上会让内存用量翻倍,因为 datetime 类型是 64 位的。将其转换成 datetime 类型是有价值的,因为这让我们可以更好地进行时间序列分析。
 
pandas.to_datetime() 函数可以帮我们完成这种转换,使用其 format 参数将我们的日期数据存储成 YYYY-MM-DD 形式。
<section>optimized_gl[<span style="color: rgb(221, 17, 68);line-height: 26px;">'date'</span>] = pd.to_datetime(date,format=<span style="color: rgb(221, 17, 68);line-height: 26px;">'%Y%m%d'</span>)<br  /><br  />print(mem_usage(optimized_gl))<br  />optimized_gl.date.head()</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">104.29</span> MB</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>   <span style="color: rgb(0, 128, 128);line-height: 26px;">1871-05-04</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>   <span style="color: rgb(0, 128, 128);line-height: 26px;">1871-05-05</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>   <span style="color: rgb(0, 128, 128);line-height: 26px;">1871-05-06</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>   <span style="color: rgb(0, 128, 128);line-height: 26px;">1871-05-08</span><br  /><span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>   <span style="color: rgb(0, 128, 128);line-height: 26px;">1871-05-09</span><br  />Name: date, dtype: datetime64[ns]</section>

在读入数据的同时选择类型

 
现在,我们已经探索了减少现有 dataframe 的内存占用的方法。通过首先读入 dataframe,然后在这个过程中迭代以减少内存占用,我们了解了每种优化方法可以带来的内存减省量。但是正如我们前面提到的一样,我们往往没有足够的内存来表示数据集中的所有值。如果我们一开始甚至无法创建 dataframe,我们又可以怎样应用节省内存的技术呢?
 
幸运的是,我们可以在读入数据的同时指定最优的列类型。pandas.read_csv() 函数有几个不同的参数让我们可以做到这一点。dtype 参数接受具有(字符串)列名称作为键值(key)以及 NumPy 类型 object 作为值的词典。
 
首先,我们可将每一列的最终类型存储在一个词典中,其中键值表示列名称,首先移除日期列,因为日期列需要不同的处理方式。
<section>dtypes = optimized_gl.drop(<span style="color: rgb(221, 17, 68);line-height: 26px;">'date'</span>,axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>).dtypes<br  /><br  />dtypes_col = dtypes.index<br  />dtypes_type = [i.name <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> dtypes.values]<br  /><br  />column_types = dict(zip(dtypes_col, dtypes_type))<br  /><br  /><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># rather than print all 161 items, we'll</span><br  /><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># sample 10 key/value pairs from the dict</span><br  /><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># and print it nicely using prettyprint</span><br  /><br  />preview = first2pairs = {key:value <span style="font-weight: bold;line-height: 26px;">for</span> key,value <span style="font-weight: bold;line-height: 26px;">in</span> list(column_types.items())[:<span style="color: rgb(0, 128, 128);line-height: 26px;">10</span>]}<br  /><span style="font-weight: bold;line-height: 26px;">import</span> pprint<br  />pp = pp = pprint.PrettyPrinter(indent=<span style="color: rgb(0, 128, 128);line-height: 26px;">4</span>)<br  />pp.pprint(preview)</section>
<section>{   <span style="color: rgb(221, 17, 68);line-height: 26px;">'acquisition_info'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'h_caught_stealing'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'float32'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'h_player_1_name'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'h_player_9_name'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_assists'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'float32'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_first_catcher_interference'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'float32'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_grounded_into_double'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'float32'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_player_1_id'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_player_3_id'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>,<br  />    <span style="color: rgb(221, 17, 68);line-height: 26px;">'v_player_5_id'</span>: <span style="color: rgb(221, 17, 68);line-height: 26px;">'category'</span>}</section>
现在我们可以使用这个词典了,另外还有几个参数可用于按正确的类型读入日期,而且仅需几行代码:
<section>read_and_optimized = pd.read_csv(<span style="color: rgb(221, 17, 68);line-height: 26px;">'game_logs.csv'</span>,dtype=column_types,parse_dates=[<span style="color: rgb(221, 17, 68);line-height: 26px;">'date'</span>],infer_datetime_format=<span style="color: rgb(0, 128, 128);line-height: 26px;">True</span>)<br  /><br  />print(mem_usage(read_and_optimized))<br  />read_and_optimized.head()</section>
<section><span style="color: rgb(0, 128, 128);line-height: 26px;">104.28</span> MB</section>
Pandas 骚操作:如何将运行内存占用降低 90%!
上图完整图像详见原文

通过优化这些列,我们成功将 pandas 的内存占用从 861.6MB 减少到了 104.28MB——减少了惊人的 88%!
 
分析棒球比赛
 
现在我们已经优化好了我们的数据,我们可以执行一些分析了。让我们先从了解这些比赛的日期分布开始。
<section>optimized_gl[<span style="color: rgb(221, 17, 68);line-height: 26px;">'year'</span>] = optimized_gl.date.dt.year<br  />games_per_day = optimized_gl.pivot_table(index=<span style="color: rgb(221, 17, 68);line-height: 26px;">'year'</span>,columns=<span style="color: rgb(221, 17, 68);line-height: 26px;">'day_of_week'</span>,values=<span style="color: rgb(221, 17, 68);line-height: 26px;">'date'</span>,aggfunc=len)<br  />games_per_day = games_per_day.divide(games_per_day.sum(axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>),axis=<span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>)<br  /><br  />ax = games_per_day.plot(kind=<span style="color: rgb(221, 17, 68);line-height: 26px;">'area'</span>,stacked=<span style="color: rgb(221, 17, 68);line-height: 26px;">'true'</span>)<br  />ax.legend(loc=<span style="color: rgb(221, 17, 68);line-height: 26px;">'upper right'</span>)<br  />ax.set_ylim(<span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>,<span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>)<br  />plt.show()</section>
Pandas 骚操作:如何将运行内存占用降低 90%!
我们可以看到在 1920 年代以前,星期日的棒球比赛很少,但在上个世纪后半叶就变得越来越多了。
 
我们也可以清楚地看到过去 50 年来,比赛的日期分布基本上没什么大变化了。

让我们再看看比赛时长的变化情况:
<section>game_lengths = optimized_gl.pivot_table(index=<span style="color: rgb(221, 17, 68);line-height: 26px;">'year'</span>, values=<span style="color: rgb(221, 17, 68);line-height: 26px;">'length_minutes'</span>)<br  />game_lengths.reset_index().plot.scatter(<span style="color: rgb(221, 17, 68);line-height: 26px;">'year'</span>,<span style="color: rgb(221, 17, 68);line-height: 26px;">'length_minutes'</span>)<br  />plt.show()</section>
Pandas 骚操作:如何将运行内存占用降低 90%!
从 1940 年代以来,棒球比赛的持续时间越来越长。

总结和下一步
 
我们已经了解了 pandas 使用不同数据类型的方法,然后我们使用这种知识将一个 pandas dataframe 的内存用量减少了近 90%,而且也仅使用了一些简单的技术:
 
  • 将数值列向下转换成更高效的类型

  • 将字符串列转换成 categorical 类型


左手Python,右手Java,升职就业不愁啦!




<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="padding-right: 10px;padding-left: 10px;max-width: 100%;white-space: normal;line-height: 1.6;letter-spacing: 0px;word-break: break-word;text-align: left;font-family: -apple-system, system-ui, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor="rgb(36, 36, 36)" data-style="background-color: rgb(255, 255, 255); letter-spacing: 0.544px; font-size: 16px; text-align: center; color: rgba(230, 230, 230, 0.9) !important;" class="js_darkmode__45" data-darkmode-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" style="max-width: 100%;letter-spacing: 0.544px;text-align: center;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="padding: 10px;max-width: 100%;color: black;line-height: 1.6;letter-spacing: 0px;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;font-size: 16px;font-weight: 700;letter-spacing: 0.544px;widows: 1;word-spacing: 1px;caret-color: rgb(51, 51, 51);color: rgb(63, 63, 63);line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(168, 168, 168)" data-darkmode-original-color="rgb(62, 62, 62)" data-style="max-width: 100%; font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 16px; letter-spacing: 0.544px; white-space: normal; background-color: rgb(255, 255, 255); color: rgb(62, 62, 62); text-align: left; box-sizing: border-box !important; overflow-wrap: break-word !important;" style="max-width: 100%;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;color: rgb(62, 62, 62);box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" data-mpa-powered-by="yiban.io" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;letter-spacing: 0.544px;font-size: 15px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;font-size: 16px;font-family: 微软雅黑, "Helvetica Nue", sans-serif;word-spacing: 1.6px;text-align: center;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;line-height: 1.6;letter-spacing: 0px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor="rgb(36, 36, 36)" data-style="background-color: rgb(255, 255, 255); color: rgba(230, 230, 230, 0.9); letter-spacing: 0.544px; text-size-adjust: auto; font-size: 16px; text-align: center; word-spacing: 1.6px;" data-darkmode-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-bgcolor-15862411819306="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15862411819306="rgb(255, 255, 255)" data-darkmode-color-15862411819306="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15862411819306="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15862671987026="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15862671987026="rgb(255, 255, 255)" data-darkmode-color-15862671987026="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15862671987026="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15864118999603="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15864118999603="rgb(255, 255, 255)" data-darkmode-color-15864118999603="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15864118999603="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15864940858736="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15864940858736="rgb(255, 255, 255)" data-darkmode-color-15864940858736="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15864940858736="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15869584691402="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15869584691402="rgb(255, 255, 255)" data-darkmode-color-15869584691402="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15869584691402="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15869584691739="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15869584691739="rgb(255, 255, 255)" data-darkmode-color-15869584691739="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15869584691739="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15873005456075="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15873005456075="rgb(255, 255, 255)" data-darkmode-color-15873005456075="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15873005456075="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15873005456615="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15873005456615="rgb(255, 255, 255)" data-darkmode-color-15873005456615="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15873005456615="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15886839320558="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15886839320558="rgb(255, 255, 255)" data-darkmode-color-15886839320558="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15886839320558="rgba(230, 230, 230, 0.9)" data-darkmode-color-159923607914210="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-159923607914210="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-159923607914210="rgb(25, 25, 25)" data-darkmode-original-bgcolor-159923607914210="rgb(255, 255, 255)" data-darkmode-bgcolor-160008070860010="rgb(25, 25, 25)" data-darkmode-original-bgcolor-160008070860010="rgb(255, 255, 255)" data-darkmode-color-160008070860010="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-160008070860010="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-16072664870629="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16072664870629="rgb(255, 255, 255)" data-darkmode-color-16072664870629="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-16072664870629="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-16073544711184="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16073544711184="rgb(255, 255, 255)" data-darkmode-color-16073544711184="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-16073544711184="rgba(230, 230, 230, 0.9)" style="max-width: 100%;letter-spacing: 0.544px;word-spacing: 1.6px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor="rgb(36, 36, 36)" data-style="background-color: rgb(255, 255, 255); color: rgba(230, 230, 230, 0.9); letter-spacing: 0.544px; text-size-adjust: auto; font-size: 16px; text-align: center; word-spacing: 1.6px;" data-darkmode-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-color="rgba(230, 230, 230, 0.9)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-bgcolor-15862411819306="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15862411819306="rgb(255, 255, 255)" data-darkmode-color-15862411819306="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15862411819306="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15862671987026="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15862671987026="rgb(255, 255, 255)" data-darkmode-color-15862671987026="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15862671987026="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15864118999603="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15864118999603="rgb(255, 255, 255)" data-darkmode-color-15864118999603="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15864118999603="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15864940858736="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15864940858736="rgb(255, 255, 255)" data-darkmode-color-15864940858736="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15864940858736="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15869584691402="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15869584691402="rgb(255, 255, 255)" data-darkmode-color-15869584691402="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15869584691402="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15869584691739="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15869584691739="rgb(255, 255, 255)" data-darkmode-color-15869584691739="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15869584691739="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15873005456075="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15873005456075="rgb(255, 255, 255)" data-darkmode-color-15873005456075="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15873005456075="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15873005456615="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15873005456615="rgb(255, 255, 255)" data-darkmode-color-15873005456615="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15873005456615="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15886839320558="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15886839320558="rgb(255, 255, 255)" data-darkmode-color-15886839320558="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15886839320558="rgba(230, 230, 230, 0.9)" data-darkmode-color-159923607914210="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-159923607914210="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-159923607914210="rgb(25, 25, 25)" data-darkmode-original-bgcolor-159923607914210="rgb(255, 255, 255)" data-darkmode-bgcolor-160008070860010="rgb(25, 25, 25)" data-darkmode-original-bgcolor-160008070860010="rgb(255, 255, 255)" data-darkmode-color-160008070860010="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-160008070860010="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-16072664870629="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16072664870629="rgb(255, 255, 255)" data-darkmode-color-16072664870629="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-16072664870629="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-16073544711184="rgb(25, 25, 25)" data-darkmode-original-bgcolor-16073544711184="rgb(255, 255, 255)" data-darkmode-color-16073544711184="rgba(163, 163, 163, 0.9)" data-darkmode-original-color-16073544711184="rgba(230, 230, 230, 0.9)" style="max-width: 100%;letter-spacing: 0.544px;word-spacing: 1.6px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><p style="max-width: 100%;min-height: 1em;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;text-size-adjust: auto;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><img class="__bg_gif" data-ratio="0.08658008658008658" data-type="gif" data-w="462" data-width="100%"  style="color: rgb(0, 0, 0);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;display: block;box-sizing: border-box !important;overflow-wrap: break-word !important;visibility: visible !important;width: 578px !important;" src="https://www.zkxjob.com/wp-content/uploads/2022/07/wxsync-2022-07-ae45c8833e6e59cceba3c2fda2df37d1.gif"  /></p><p style="max-width: 100%;min-height: 1em;font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;text-size-adjust: auto;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"  /></p>


推荐阅读:

入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径


干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影


趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!


AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影


小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!


年度爆款文案

  • 1).卧槽!Pdf转Word用Python轻松搞定

  • 2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃

  • 3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 

  • 4).80行代码!用Python做一个哆来A梦分身 

  • 5).你必须掌握的20个python代码,短小精悍,用处无穷 

  • 6).30个Python奇淫技巧集 

  • 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 

  • 8).再见Python!我要学Go了!2500字深度分析!

  • 9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片


<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="padding: 10px;max-width: 100%;color: black;line-height: 1.6;letter-spacing: 0px;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;font-size: 16px;font-weight: 700;letter-spacing: 0.544px;widows: 1;word-spacing: 1px;caret-color: rgb(51, 51, 51);color: rgb(63, 63, 63);line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(168, 168, 168)" data-darkmode-original-color="rgb(62, 62, 62)" data-style="max-width: 100%; font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif; font-size: 16px; letter-spacing: 0.544px; white-space: normal; background-color: rgb(255, 255, 255); color: rgb(62, 62, 62); text-align: left; box-sizing: border-box !important; overflow-wrap: break-word !important;" style="max-width: 100%;font-family: -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;color: rgb(62, 62, 62);box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" data-mpa-powered-by="yiban.io" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;letter-spacing: 0.544px;font-size: 15px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-role="outer" label="Powered by 135editor.com" style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;font-size: 16px;font-family: 微软雅黑, "Helvetica Nue", sans-serif;word-spacing: 1.6px;text-align: center;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;line-height: 1.6;letter-spacing: 0px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;white-space: pre-wrap;font-family: 微软雅黑, "Helvetica Nue", sans-serif;letter-spacing: 0.544px;word-spacing: 1.6px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;font-size: 15px;color: rgb(15, 14, 14);box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="padding-right: 10px;padding-left: 10px;max-width: 100%;font-size: 16px;color: black;line-height: 1.6;letter-spacing: 0px;word-break: break-word;text-align: left;font-family: PingFangSC-Light, STHeitiSC-Light, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tools="135编辑器" data-id="93743" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-author="Wxeditor" style="padding-right: 0.5em;padding-left: 0.5em;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(168, 168, 168)" data-darkmode-original-color-15923650965579="rgb(62, 62, 62)" data-style="color: rgb(62, 62, 62); font-size: 15px; letter-spacing: 0.544px; background-color: rgb(255, 255, 255); font-family: monospace; text-align: left; widows: 1; word-spacing: 2px; caret-color: rgb(255, 0, 0); white-space: pre-wrap;" style="max-width: 100%;font-size: 15px;letter-spacing: 0.544px;word-spacing: 2px;caret-color: rgb(255, 0, 0);color: rgb(62, 62, 62);white-space: pre-wrap;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section mpa-from-tpl="t" data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(168, 168, 168)" data-darkmode-original-color-15923650965579="rgb(62, 62, 62)" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(167, 167, 167)" data-darkmode-original-color-15923650965579="rgb(63, 63, 63)" data-style="letter-spacing: 0.544px; font-size: 16px; color: rgb(63, 63, 63); word-spacing: 1px; line-height: inherit;" style="max-width: 100%;letter-spacing: 0.544px;font-size: 16px;color: rgb(63, 63, 63);word-spacing: 1px;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template-id="1250" data-mpa-color="#ffffff" data-mpa-category="divider" data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(230, 230, 230)" data-darkmode-original-color="rgb(0, 0, 0)" data-style="margin-right: 0.5em; margin-left: 0.5em; white-space: normal; font-family: -apple-system-font, system-ui, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif; color: rgb(0, 0, 0); letter-spacing: 0px; word-spacing: 2px;" data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(230, 230, 230)" data-darkmode-original-color-15923650965579="rgb(0, 0, 0)" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(167, 167, 167)" data-darkmode-original-color-15923650965579="rgb(63, 63, 63)" data-style="letter-spacing: 0.544px; font-size: 16px; color: rgb(63, 63, 63); word-spacing: 1px; line-height: inherit;" style="max-width: 100%;letter-spacing: 0.544px;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template-id="1250" data-mpa-color="#ffffff" data-mpa-category="divider" data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(230, 230, 230)" data-darkmode-original-color="rgb(0, 0, 0)" data-style="margin-right: 0.5em; margin-left: 0.5em; white-space: normal; font-family: -apple-system-font, system-ui, 'Helvetica Neue', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei UI', 'Microsoft YaHei', Arial, sans-serif; color: rgb(0, 0, 0); letter-spacing: 0px; word-spacing: 2px;" data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(230, 230, 230)" data-darkmode-original-color-15923650965579="rgb(0, 0, 0)" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(230, 230, 230)" data-darkmode-original-color="rgb(0, 0, 0)" data-darkmode-bgcolor-15923650965579="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15923650965579="rgb(255, 255, 255)" data-darkmode-color-15923650965579="rgb(230, 230, 230)" data-darkmode-original-color-15923650965579="rgb(0, 0, 0)" style="margin-right: 0em;margin-left: 0em;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-right: 0.5em;margin-left: 0.5em;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(168, 168, 168)" data-darkmode-original-color="rgb(62, 62, 62)" data-style="letter-spacing: 0.544px; font-weight: 700; text-align: -webkit-center; background-color: rgb(255, 255, 255); font-size: 16px; color: rgb(62, 62, 62); widows: 1; word-spacing: 2px;" style="max-width: 100%;letter-spacing: 0.544px;text-align: center;color: rgb(62, 62, 62);box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor="rgb(36, 36, 36)" data-darkmode-original-bgcolor="rgb(255, 255, 255)" data-darkmode-color="rgb(168, 168, 168)" data-darkmode-original-color="rgb(62, 62, 62)" data-style="letter-spacing: 0.544px; font-weight: 700; text-align: -webkit-center; background-color: rgb(255, 255, 255); font-size: 16px; color: rgb(62, 62, 62); widows: 1; word-spacing: 2px;" style="max-width: 100%;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;letter-spacing: 0.544px;text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><h1 style="max-width: 100%;white-space: pre-wrap;letter-spacing: 0.544px;font-family: 微软雅黑;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;letter-spacing: 0.544px;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-id="94086" data-color="#276ca3" data-tools="135编辑器" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;color: rgb(63, 63, 63);letter-spacing: 0.544px;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-mpa-template="t" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-id="94086" data-color="#276ca3" data-tools="135编辑器" mpa-from-tpl="t" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section mpa-from-tpl="t" style="max-width: 100%;display: inline-block;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre style="max-width: 100%;letter-spacing: 0.544px;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;"><pre data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-style="letter-spacing: 0.544px; background-color: rgb(255, 255, 255); text-align: center; color: rgba(230, 230, 230, 0.9); font-size: 16px; line-height: 25.6px; overflow-wrap: break-word !important;" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15882396318564="rgba(230, 230, 230, 0.9)" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgba(230, 230, 230, 0.9)" data-darkmode-original-color-15900529136199="rgba(230, 230, 230, 0.9)" style="max-width: 100%;letter-spacing: 0.544px;text-align: center;color: rgba(230, 230, 230, 0.9);line-height: 25.6px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" style="max-width: 100%;display: inline-block;clear: both;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-tools="135编辑器" data-id="91842" data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" style="max-width: 100%;letter-spacing: 0.544px;border-width: 0px;border-style: none;border-color: initial;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" style="max-width: 100%;display: inline-block;clear: both;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-brushtype="text" data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgimage-15860613985508="1" data-style="padding: 18px 15px 20px 10px; color: rgb(86, 146, 214); text-align: center; letter-spacing: 1.5px; background-image: url('https://www.zkxjob.com/wp-content/uploads/2022/07/wxsync-2022-07-a2a8a5e1e58f30392066a170034ee027.png'); background-size: 100% 100%; background-repeat: no-repeat; overflow-wrap: break-word !important;" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgimage-15870356070738="1" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgimage-15870356071023="1" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgimage-15882384789136="1" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgimage-15882396318564="1" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" data-darkmode-bgimage-15900529136199="1" style="padding: 18px 15px 20px 10px;max-width: 100%;background-size: 100% 100%;background-image: url('https://www.zkxjob.com/wp-content/uploads/2022/07/wxsync-2022-07-a2a8a5e1e58f30392066a170034ee027.png');color: rgb(86, 146, 214);letter-spacing: 1.5px;background-repeat: no-repeat;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgimage-15860613985508="1" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgimage-15870356070738="1" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgimage-15870356071023="1" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgimage-15882384789136="1" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgimage-15882396318564="1" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" data-darkmode-bgimage-15900529136199="1" style="max-width: 100%;display: flex;justify-content: center;align-items: center;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(230, 230, 230)" data-darkmode-original-color-15860613985508="rgb(0, 0, 0)" data-darkmode-bgimage-15860613985508="1" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(230, 230, 230)" data-darkmode-original-color-15870356070738="rgb(0, 0, 0)" data-darkmode-bgimage-15870356070738="1" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(230, 230, 230)" data-darkmode-original-color-15870356071023="rgb(0, 0, 0)" data-darkmode-bgimage-15870356071023="1" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(230, 230, 230)" data-darkmode-original-color-15882384789136="rgb(0, 0, 0)" data-darkmode-bgimage-15882384789136="1" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(230, 230, 230)" data-darkmode-original-color-15882396318564="rgb(0, 0, 0)" data-darkmode-bgimage-15882396318564="1" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(230, 230, 230)" data-darkmode-original-color-15900529136199="rgb(0, 0, 0)" data-darkmode-bgimage-15900529136199="1" style="margin-left: 2px;max-width: 100%;width: 20px;box-sizing: border-box !important;overflow-wrap: break-word !important;"></section><section data-brushtype="text" data-darkmode-bgcolor-15860613985508="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15860613985508="rgb(255, 255, 255)" data-darkmode-color-15860613985508="rgb(51, 51, 51)" data-darkmode-original-color-15860613985508="rgb(51, 51, 51)" data-darkmode-bgimage-15860613985508="1" data-darkmode-bgcolor-15870356070738="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356070738="rgb(255, 255, 255)" data-darkmode-color-15870356070738="rgb(51, 51, 51)" data-darkmode-original-color-15870356070738="rgb(51, 51, 51)" data-darkmode-bgimage-15870356070738="1" data-darkmode-bgcolor-15870356071023="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15870356071023="rgb(255, 255, 255)" data-darkmode-color-15870356071023="rgb(51, 51, 51)" data-darkmode-original-color-15870356071023="rgb(51, 51, 51)" data-darkmode-bgimage-15870356071023="1" data-darkmode-bgcolor-15882384789136="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882384789136="rgb(255, 255, 255)" data-darkmode-color-15882384789136="rgb(51, 51, 51)" data-darkmode-original-color-15882384789136="rgb(51, 51, 51)" data-darkmode-bgimage-15882384789136="1" data-darkmode-bgcolor-15882396318564="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15882396318564="rgb(255, 255, 255)" data-darkmode-color-15882396318564="rgb(51, 51, 51)" data-darkmode-original-color-15882396318564="rgb(51, 51, 51)" data-darkmode-bgimage-15882396318564="1" data-darkmode-bgcolor-15900529136199="rgb(36, 36, 36)" data-darkmode-original-bgcolor-15900529136199="rgb(255, 255, 255)" data-darkmode-color-15900529136199="rgb(51, 51, 51)" data-darkmode-original-color-15900529136199="rgb(51, 51, 51)" data-darkmode-bgimage-15900529136199="1" style="max-width: 100%;font-size: 14px;color: rgb(51, 51, 51);text-align: left;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;font-family: 楷体, 楷体_GB2312, SimKai;white-space: pre-wrap;font-size: 12px;box-sizing: border-box !important;overflow-wrap: break-word !important;">点阅读原文,领AI全套资料!</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 17px;text-align: justify;"></span></section></section></section></section></section></section></section>

本篇文章来源于: 菜鸟学Python

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

你可能也喜欢

热评文章

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享