知行编程网知行编程网  2022-07-26 09:00 知行编程网 隐藏边栏 |   抢沙发  7 
文章评分 0 次,平均分 0.0

pandas100个骚操作:再见 for 循环!速度提升315倍!

来源:Python数据科学

作者:东哥起飞


大家好,我是东哥。

本篇是pandas100个骚操作系列的第 11 篇:再见 for 循环!速度提升315倍!

系列内容,请看👉「pandas100个骚操作」话题,订阅后文章更新可第一时间推送至订阅号。


上一篇分享了一个从时间处理上的加速方法「使用 Datetime 提速 50 倍运行速度!,本篇分享一个更常用的加速骚操作。
for是所有编程语言的基础语法,初学者为了快速实现功能,依懒性较强。但如果从运算时间性能上考虑可能不是特别好的选择。
本次东哥介绍几个常见的提速方法,一个比一个快,了解pandas本质,才能知道如何提速。
下面是一个例子,数据获取方式见文末
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span><span style="color: rgb(198, 120, 221);line-height: 26px;">import</span> pandas <span style="color: rgb(198, 120, 221);line-height: 26px;">as</span> pd<br  /><span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 导入数据集</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>df = pd.read_csv(<span style="color: rgb(152, 195, 121);line-height: 26px;">'demand_profile.csv'</span>)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>df.head()<br  />     date_time  energy_kwh<br  /><span style="color: rgb(209, 154, 102);line-height: 26px;">0</span>  <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">13</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">0</span>:<span style="color: rgb(209, 154, 102);line-height: 26px;">00</span>       <span style="color: rgb(209, 154, 102);line-height: 26px;">0.586</span><br  /><span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>  <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">13</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>:<span style="color: rgb(209, 154, 102);line-height: 26px;">00</span>       <span style="color: rgb(209, 154, 102);line-height: 26px;">0.580</span><br  /><span style="color: rgb(209, 154, 102);line-height: 26px;">2</span>  <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">13</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">2</span>:<span style="color: rgb(209, 154, 102);line-height: 26px;">00</span>       <span style="color: rgb(209, 154, 102);line-height: 26px;">0.572</span><br  /><span style="color: rgb(209, 154, 102);line-height: 26px;">3</span>  <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">13</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span>:<span style="color: rgb(209, 154, 102);line-height: 26px;">00</span>       <span style="color: rgb(209, 154, 102);line-height: 26px;">0.596</span><br  /><span style="color: rgb(209, 154, 102);line-height: 26px;">4</span>  <span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>/<span style="color: rgb(209, 154, 102);line-height: 26px;">13</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">4</span>:<span style="color: rgb(209, 154, 102);line-height: 26px;">00</span>       <span style="color: rgb(209, 154, 102);line-height: 26px;">0.592</span><br  /></section>
基于上面的数据,我们现在要增加一个新的特征,但这个新的特征是基于一些时间条件生成的,根据时长(小时)而变化,如下:

pandas100个骚操作:再见 for 循环!速度提升315倍!

因此,如果你不知道如何提速,那正常第一想法可能就是用apply方法写一个函数,函数里面写好时间条件的逻辑代码。

<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff</span><span style="line-height: 26px;">(kwh, hour)</span>:</span><br  />    <span style="color: rgb(152, 195, 121);line-height: 26px;">"""计算每个小时的电费"""</span>    <br  />    <span style="color: rgb(198, 120, 221);line-height: 26px;">if</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">0</span> <= hour < <span style="color: rgb(209, 154, 102);line-height: 26px;">7</span>:<br  />        rate = <span style="color: rgb(209, 154, 102);line-height: 26px;">12</span><br  />    <span style="color: rgb(198, 120, 221);line-height: 26px;">elif</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">7</span> <= hour < <span style="color: rgb(209, 154, 102);line-height: 26px;">17</span>:<br  />        rate = <span style="color: rgb(209, 154, 102);line-height: 26px;">20</span><br  />    <span style="color: rgb(198, 120, 221);line-height: 26px;">elif</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">17</span> <= hour < <span style="color: rgb(209, 154, 102);line-height: 26px;">24</span>:<br  />        rate = <span style="color: rgb(209, 154, 102);line-height: 26px;">28</span><br  />    <span style="color: rgb(198, 120, 221);line-height: 26px;">else</span>:<br  />        <span style="color: rgb(198, 120, 221);line-height: 26px;">raise</span> ValueError(<span style="color: rgb(152, 195, 121);line-height: 26px;">f'Invalid hour: <span style="color: rgb(224, 108, 117);line-height: 26px;">{hour}</span>'</span>)<br  />    <span style="color: rgb(198, 120, 221);line-height: 26px;">return</span> rate * kwh<br  /></section>
然后使用for循环来遍历df,根据apply函数逻辑添加新的特征,如下:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span><span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 不赞同这种操作</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>@timeit(repeat=<span style="color: rgb(209, 154, 102);line-height: 26px;">3</span>, number=<span style="color: rgb(209, 154, 102);line-height: 26px;">100</span>)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_loop</span><span style="line-height: 26px;">(df)</span>:</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    <span style="color: rgb(152, 195, 121);line-height: 26px;">"""用for循环计算enery cost,并添加到列表"""</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    energy_cost_list = []<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    <span style="color: rgb(198, 120, 221);line-height: 26px;">for</span> i <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> range(len(df)):<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        <span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 获取用电量和时间(小时)</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_used = df.iloc[i][<span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>]<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        hour = df.iloc[i][<span style="color: rgb(152, 195, 121);line-height: 26px;">'date_time'</span>].hour<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_cost = apply_tariff(energy_used, hour)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_cost_list.append(energy_cost)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = energy_cost_list<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_loop(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_loop` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">3.152</span> seconds.<br  /></section>
对于那些写Pythonic风格的人来说,这个设计看起来很自然。然而,这个循环将会严重影响效率。原因有几个:
首先,它需要初始化一个将记录输出的列表。
其次,它使用不透明对象范围(0,len(df))循环,然后再应用apply_tariff()之后,它必须将结果附加到用于创建新DataFrame列的列表中。另外,还使用df.iloc [i]['date_time']执行所谓的链式索引,这通常会导致意外的结果。
这种方法的最大问题是计算的时间成本。对于8760行数据,此循环花费了3秒钟。
接下来,一起看下优化的提速方案。

一、使用 iterrows循环

第一种可以通过pandas引入iterrows方法让效率更高。这些都是一次产生一行的生成器方法,类似scrapy中使用的yield用法。
.itertuples为每一行产生一个namedtuple,并且行的索引值作为元组的第一个元素。nametuplePythoncollections模块中的一种数据结构,其行为类似于Python元组,但具有可通过属性查找访问的字段。
.iterrowsDataFrame中的每一行产生(index,series)这样的元组。
在这个例子中使用.iterrows,我们看看这使用iterrows后效果如何。
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>@timeit(repeat=<span style="color: rgb(209, 154, 102);line-height: 26px;">3</span>, number=<span style="color: rgb(209, 154, 102);line-height: 26px;">100</span>)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_iterrows</span><span style="line-height: 26px;">(df)</span>:</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    energy_cost_list = []<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    <span style="color: rgb(198, 120, 221);line-height: 26px;">for</span> index, row <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> df.iterrows():<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        <span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 获取用电量和时间(小时)</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_used = row[<span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>]<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        hour = row[<span style="color: rgb(152, 195, 121);line-height: 26px;">'date_time'</span>].hour<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        <span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 添加cost列表</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_cost = apply_tariff(energy_used, hour)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        energy_cost_list.append(energy_cost)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = energy_cost_list<br  />...<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_iterrows(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_iterrows` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">0.713</span> seconds.<br  /></section>
这样的语法更明确,并且行值引用中的混乱更少,因此它更具可读性。
时间成本方面:快了近5倍!
但是,还有更多的改进空间,理想情况是可以用pandas内置更快的方法完成。

二、pandas的apply方法

我们可以使用.apply方法而不是.iterrows进一步改进此操作。pandas.apply方法接受函数callables并沿DataFrame的轴(所有行或所有列)应用。下面代码中,lambda函数将两列数据传递给apply_tariff()
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>@timeit(repeat=<span style="color: rgb(209, 154, 102);line-height: 26px;">3</span>, number=<span style="color: rgb(209, 154, 102);line-height: 26px;">100</span>)<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_withapply</span><span style="line-height: 26px;">(df)</span>:</span><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>    df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = df.apply(<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        <span style="color: rgb(198, 120, 221);line-height: 26px;">lambda</span> row: apply_tariff(<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>            kwh=row[<span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>],<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>            hour=row[<span style="color: rgb(152, 195, 121);line-height: 26px;">'date_time'</span>].hour),<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">... </span>        axis=<span style="color: rgb(209, 154, 102);line-height: 26px;">1</span>)<br  />...<br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_withapply(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_withapply` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">0.272</span> seconds.<br  /></section>
apply的语法优点很明显,行数少,代码可读性高。在这种情况下,所花费的时间大约是iterrows方法的一半。
但是,这还不是“非常快”。一个原因是apply()将在内部尝试循环遍历Cython迭代器。但是在这种情况下,传递的lambda不是可以在Cython中处理的东西,因此它在Python中调用并不是那么快。
如果我们使用apply()方法获取10年的小时数据,那么将需要大约15分钟的处理时间。如果这个计算只是大规模计算的一小部分,那么真的应该提速了。这也就是矢量化操作派上用场的地方。

三、矢量化操作:使用.isin选择数据

什么是矢量化操作?
如果你不基于一些条件,而是可以在一行代码中将所有电力消耗数据应用于该价格:df ['energy_kwh'] * 28,类似这种。那么这个特定的操作就是矢量化操作的一个例子,它是在pandas中执行的最快方法。
但是如何将条件计算应用为pandas中的矢量化运算?
一个技巧是:根据你的条件,选择和分组DataFrame,然后对每个选定的组应用矢量化操作。
在下面代码中,我们将看到如何使用pandas.isin()方法选择行,然后在矢量化操作中实现新特征的添加。在执行此操作之前,如果将date_time列设置为DataFrame的索引,会更方便:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 将date_time列设置为DataFrame的索引</span><br  />df.set_index(<span style="color: rgb(152, 195, 121);line-height: 26px;">'date_time'</span>, inplace=<span style="color: rgb(86, 182, 194);line-height: 26px;">True</span>)<br  /><br  /><span style="color: rgb(97, 174, 238);line-height: 26px;">@timeit(repeat=3, number=100)</span><br  /><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_isin</span><span style="line-height: 26px;">(df)</span>:</span><br  />    <span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 定义小时范围Boolean数组</span><br  />    peak_hours = df.index.hour.isin(range(<span style="color: rgb(209, 154, 102);line-height: 26px;">17</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">24</span>))<br  />    shoulder_hours = df.index.hour.isin(range(<span style="color: rgb(209, 154, 102);line-height: 26px;">7</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">17</span>))<br  />    off_peak_hours = df.index.hour.isin(range(<span style="color: rgb(209, 154, 102);line-height: 26px;">0</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">7</span>))<br  /><br  />    <span style="color: rgb(92, 99, 112);font-style: italic;line-height: 26px;"># 使用上面apply_traffic函数中的定义</span><br  />    df.loc[peak_hours, <span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = df.loc[peak_hours, <span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>] * <span style="color: rgb(209, 154, 102);line-height: 26px;">28</span><br  />    df.loc[shoulder_hours,<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = df.loc[shoulder_hours, <span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>] * <span style="color: rgb(209, 154, 102);line-height: 26px;">20</span><br  />    df.loc[off_peak_hours,<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = df.loc[off_peak_hours, <span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>] * <span style="color: rgb(209, 154, 102);line-height: 26px;">12</span><br  /></section>
我们来看一下结果如何。
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_isin(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_isin` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">0.010</span> seconds.<br  /></section>
提示,上面.isin()方法返回的是一个布尔值数组,如下:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;">[<span style="color: rgb(86, 182, 194);line-height: 26px;">False</span>, <span style="color: rgb(86, 182, 194);line-height: 26px;">False</span>, <span style="color: rgb(86, 182, 194);line-height: 26px;">False</span>, ..., <span style="color: rgb(86, 182, 194);line-height: 26px;">True</span>, <span style="color: rgb(86, 182, 194);line-height: 26px;">True</span>, <span style="color: rgb(86, 182, 194);line-height: 26px;">True</span>]<br  /></section>
布尔值标识了DataFrame索引datetimes是否落在了指定的小时范围内。然后把这些布尔数组传递给DataFrame.loc,将获得一个与这些小时匹配的DataFrame切片。然后再将切片乘以适当的费率,这就是一种快速的矢量化操作了。
上面的方法完全取代了我们最开始自定义的函数apply_tariff(),代码大大减少,同时速度起飞。
运行时间比Pythonic的for循环快315倍,比iterrows快71倍,比apply快27倍!

四、还能更快?

太刺激了,我们继续加速。
在上面apply_tariff_isin中,我们通过调用df.locdf.index.hour.isin三次来进行一些手动调整。如果我们有更精细的时间范围,你可能会说这个解决方案是不可扩展的。但在这种情况下,我们可以使用pandaspd.cut()函数来自动完成切割:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">@timeit(repeat=3, number=100)</span><br  /><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_cut</span><span style="line-height: 26px;">(df)</span>:</span><br  />    cents_per_kwh = pd.cut(x=df.index.hour,<br  />                           bins=[<span style="color: rgb(209, 154, 102);line-height: 26px;">0</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">7</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">17</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">24</span>],<br  />                           include_lowest=<span style="color: rgb(86, 182, 194);line-height: 26px;">True</span>,<br  />                           labels=[<span style="color: rgb(209, 154, 102);line-height: 26px;">12</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">20</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">28</span>]).astype(int)<br  />    df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = cents_per_kwh * df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>]<br  /></section>
上面代码pd.cut()会根据bin列表应用分组。
其中include_lowest参数表示第一个间隔是否应该是包含左边的。
这是一种完全矢量化的方法,它在时间方面是最快的:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_cut(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_cut` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">0.003</span> seconds.<br  /></section>
到目前为止,使用pandas处理的时间上基本快达到极限了!只需要花费不到一秒的时间即可处理完整的10年的小时数据集。
但是,最后一个其它选择,就是使用 NumPy,还可以更快!

五、使用Numpy继续加速

使用pandas时不应忘记的一点是PandasSeriesDataFrames是在NumPy库之上设计的。并且,pandas可以与NumPy阵列和操作无缝衔接。
下面我们使用NumPy的 digitize()函数更进一步。它类似于上面pandascut(),因为数据将被分箱,但这次它将由一个索引数组表示,这些索引表示每小时所属的bin。然后将这些索引应用于价格数组:
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">@timeit(repeat=3, number=100)</span><br  /><span style="line-height: 26px;"><span style="color: rgb(198, 120, 221);line-height: 26px;">def</span> <span style="color: rgb(97, 174, 238);line-height: 26px;">apply_tariff_digitize</span><span style="line-height: 26px;">(df)</span>:</span><br  />    prices = np.array([<span style="color: rgb(209, 154, 102);line-height: 26px;">12</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">20</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">28</span>])<br  />    bins = np.digitize(df.index.hour.values, bins=[<span style="color: rgb(209, 154, 102);line-height: 26px;">7</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">17</span>, <span style="color: rgb(209, 154, 102);line-height: 26px;">24</span>])<br  />    df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'cost_cents'</span>] = prices[bins] * df[<span style="color: rgb(152, 195, 121);line-height: 26px;">'energy_kwh'</span>].values<br  /></section>
cut函数一样,这种语法非常简洁易读。
<section style="font-size: 12px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;display: -webkit-box;overflow-x: auto;padding: 16px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);border-radius: 0px;margin-left: 8px;margin-right: 8px;"><span style="color: rgb(97, 174, 238);line-height: 26px;">>>> </span>apply_tariff_digitize(df)<br  />Best of <span style="color: rgb(209, 154, 102);line-height: 26px;">3</span> trials <span style="color: rgb(198, 120, 221);line-height: 26px;">with</span> <span style="color: rgb(209, 154, 102);line-height: 26px;">100</span> function calls per trial:<br  />Function `apply_tariff_digitize` ran <span style="color: rgb(198, 120, 221);line-height: 26px;">in</span> average of <span style="color: rgb(209, 154, 102);line-height: 26px;">0.002</span> seconds.<br  /></section>
0.002秒! 虽然仍有性能提升,但已经很边缘化了。


<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: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 0.544px;font-size: 17px;"></span></section></section></section></section></section></section></section>

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

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

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

你可能也喜欢

热评文章

发表评论

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