知行编程网知行编程网  2022-06-28 01:00 知行编程网 隐藏边栏 |   抢沙发  0 
文章评分 0 次,平均分 0.0

Python可以比C++更快,你不信?

Python 是一个用途非常广泛的编程语言,拥有成千上万的第三方库,在人工智能、机器学习、自动化等方面有着广泛的应用,众所周知,Python 是动态语言,有全局解释器锁,比其他静态语言要慢,也正是这个原因,你也许会转向其他语言如 Java、C++,不过先等等,今天分享一个可以让 Python 比 C++ 还要快的技术,看完再决定要不要转吧。
今天的主角就是 Numba,Numba 是一个开源的即时编译器(JIT compiler),可将 Python 和 NumPy 的代码的转换为快速的机器码,从而提升运行速度。可以达到 C 或 FORTRAN 的速度。
这么牛逼是不是很难用呢?No,No,No,So easy,你不需要替换 Python 解释器,不需要单独编译,甚至不需要安装 C / C ++ 编译器。只需将 Numba 提供的装饰器放在 Python 函数上面就行,剩下的就交给 Numba 完成。举个简单的例子:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="font-weight: bold;line-height: 26px;">from</span> numba <span style="font-weight: bold;line-height: 26px;">import</span> jit<br  /><span style="font-weight: bold;line-height: 26px;">import</span> random<br  /><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@jit(nopython=True)</span><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;">monte_carlo_pi</span><span style="line-height: 26px;">(nsamples)</span>:</span><br  />    acc = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> range(nsamples):<br  />        x = random.random()<br  />        y = random.random()<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> (x ** <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span> + y ** <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>) < <span style="color: rgb(0, 128, 128);line-height: 26px;">1.0</span>:<br  />            acc += <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">4.0</span> * acc / nsamples<br  /></span></section>
Numba 是专为科学计算而设计的,在与 NumPy 一起使用时,Numba 会为不同的数组数据类型生成专门的代码,以优化性能:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@numba.jit(nopython=True, parallel=True)</span><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;">logistic_regression</span><span style="line-height: 26px;">(Y, X, w, iterations)</span>:</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> range(iterations):<br  />        w -= np.dot(((<span style="color: rgb(0, 128, 128);line-height: 26px;">1.0</span> /<br  />              (<span style="color: rgb(0, 128, 128);line-height: 26px;">1.0</span> + np.exp(-Y * np.dot(X, w)))<br  />              - <span style="color: rgb(0, 128, 128);line-height: 26px;">1.0</span>) * Y), X)<br  />    <span style="font-weight: bold;line-height: 26px;">return</span> w<br  /></span></section>
现在我们来看看,同样的代码,使用 Numba 前后与 C++ 的性能对比。比如说我们要找出 1000 万以内所有的素数,代码的算法逻辑是相同的:
Python 代码:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="font-weight: bold;line-height: 26px;">import</span> math<br  /><span style="font-weight: bold;line-height: 26px;">import</span> time<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;">is_prime</span><span style="line-height: 26px;">(num)</span>:</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num == <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num <= <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span> <span style="font-weight: bold;line-height: 26px;">or</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> div <span style="font-weight: bold;line-height: 26px;">in</span> range(<span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>, int(math.sqrt(num) + <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>), <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % div:<br  />            <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</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;">run_program</span><span style="line-height: 26px;">(N)</span>:</span><br  />    total = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> range(N):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> is_prime(i):<br  />            total += <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> total<br  /><br  /><br  /><span style="font-weight: bold;line-height: 26px;">if</span> __name__ == <span style="color: rgb(221, 17, 68);line-height: 26px;">"__main__"</span>:<br  />    N = <span style="color: rgb(0, 128, 128);line-height: 26px;">10000000</span><br  />    start = time.time()<br  />    total = run_program(N)<br  />    end = time.time()<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"total prime num is <span style="color: rgb(51, 51, 51);line-height: 26px;">{total}</span>"</span>)<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"cost <span style="color: rgb(51, 51, 51);line-height: 26px;">{end - start}</span>s"</span>)<br  /></span></section>
执行耗时:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;">total prime num is 664579<br  />cost 47.386465072631836s<br  /></span></section>
C++ 代码如下:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">#<span style="line-height: 26px;">include</span> <span style="line-height: 26px;"><iostream></span></span><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">#<span style="line-height: 26px;">include</span> <span style="line-height: 26px;"><cmath></span></span><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">#<span style="line-height: 26px;">include</span> <span style="line-height: 26px;"><time.h></span></span><br  /><span style="font-weight: bold;line-height: 26px;">using</span> <span style="font-weight: bold;line-height: 26px;">namespace</span> <span style="color: rgb(0, 134, 179);line-height: 26px;">std</span>;<br  /><br  /><br  /><span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">bool</span> <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">isPrime</span><span style="line-height: 26px;">(<span style="font-weight: bold;line-height: 26px;">int</span> num)</span> </span>{<br  /><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> (num == <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>) <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">true</span>;<br  />    <span style="font-weight: bold;line-height: 26px;">if</span> (num <= <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span> || num % <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span> == <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>) <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">false</span>;<br  />    <span style="font-weight: bold;line-height: 26px;">double</span> sqrt_num = <span style="color: rgb(0, 134, 179);line-height: 26px;">sqrt</span>(<span style="font-weight: bold;line-height: 26px;">double</span>(num));<br  />    <span style="font-weight: bold;line-height: 26px;">for</span> (<span style="font-weight: bold;line-height: 26px;">int</span> div = <span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>; div <= sqrt_num; div +=<span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>){<br  />       <span style="font-weight: bold;line-height: 26px;">if</span> (num % div == <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>) <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">false</span>;<br  />    }<br  />     <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">true</span>;<br  />}<br  /><br  /><span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">int</span> <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">run_program</span><span style="line-height: 26px;">(<span style="font-weight: bold;line-height: 26px;">int</span> N)</span></span>{<br  /><br  />    <span style="font-weight: bold;line-height: 26px;">int</span> total = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>;<br  />    <span style="font-weight: bold;line-height: 26px;">for</span> (<span style="font-weight: bold;line-height: 26px;">int</span> i; i < N; i++) {<br  />        <span style="font-weight: bold;line-height: 26px;">if</span>(isPrime(i)) total ++;<br  />    }<br  />    <span style="font-weight: bold;line-height: 26px;">return</span> total;<br  />}<br  /><br  /><span style="line-height: 26px;"><span style="font-weight: bold;line-height: 26px;">int</span> <span style="color: rgb(153, 0, 0);font-weight: bold;line-height: 26px;">main</span><span style="line-height: 26px;">()</span><br  /></span>{<br  />    <span style="font-weight: bold;line-height: 26px;">int</span> N = <span style="color: rgb(0, 128, 128);line-height: 26px;">10000000</span>;<br  />    <span style="font-weight: bold;line-height: 26px;">clock_t</span> start,end;<br  />    start = clock();<br  />    <span style="font-weight: bold;line-height: 26px;">int</span> total = run_program(N);<br  />    end = clock();<br  />    <span style="color: rgb(0, 134, 179);line-height: 26px;">cout</span> << <span style="color: rgb(221, 17, 68);line-height: 26px;">"total prime num is "</span> << total;<br  />    <span style="color: rgb(0, 134, 179);line-height: 26px;">cout</span> << <span style="color: rgb(221, 17, 68);line-height: 26px;">"ncost "</span> << (end - start) / ((<span style="font-weight: bold;line-height: 26px;">double</span>) CLOCKS_PER_SEC) << <span style="color: rgb(221, 17, 68);line-height: 26px;">"sn"</span>;<br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span>;<br  />}<br  /></span></section>
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;">$ g++ isPrime.cpp -o isPrime<br  />$ ./isPrime<br  />total prime num is 664579<br  />cost 2.36221s<br  /></span></section>
Python可以比C++更快,你不信?
c++
C++ 确实牛逼,才 2.3 秒,不过好戏还在后头,现在我们使用 Numba 来加速一下,操作很简单,不需要改动原有的代码,先导入 Numba 的 njit,再在函数上方放个装饰器 @njit 即可,其他保持不变,代码如下:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="font-weight: bold;line-height: 26px;">import</span> math<br  /><span style="font-weight: bold;line-height: 26px;">import</span> time<br  /><span style="font-weight: bold;line-height: 26px;">from</span> numba <span style="font-weight: bold;line-height: 26px;">import</span> njit<br  /><br  /><span style="color: rgb(153, 153, 136);font-style: italic;line-height: 26px;"># @njit 相当于 @jit(nopython=True) </span><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@njit</span><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;">is_prime</span><span style="line-height: 26px;">(num)</span>:</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num == <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num <= <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span> <span style="font-weight: bold;line-height: 26px;">or</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> div <span style="font-weight: bold;line-height: 26px;">in</span> range(<span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>, int(math.sqrt(num) + <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>), <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % div:<br  />            <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</span><br  /><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@njit</span><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;">run_program</span><span style="line-height: 26px;">(N)</span>:</span><br  />    total = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> range(N):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> is_prime(i):<br  />            total += <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> total<br  /><br  /><br  /><span style="font-weight: bold;line-height: 26px;">if</span> __name__ == <span style="color: rgb(221, 17, 68);line-height: 26px;">"__main__"</span>:<br  />    N = <span style="color: rgb(0, 128, 128);line-height: 26px;">10000000</span><br  />    start = time.time()<br  />    total = run_program(N)<br  />    end = time.time()<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"total prime num is <span style="color: rgb(51, 51, 51);line-height: 26px;">{total}</span>"</span>)<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"cost <span style="color: rgb(51, 51, 51);line-height: 26px;">{end - start}</span>s"</span>)<br  /></span></section>
运行一下,可以看出时间已经从 47.39 秒降低到 3 秒。
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;">total prime num is 664579<br  />cost 3.0948808193206787s<br  /></span></section>
相比 C++ 的 2.3 秒还是有一点慢,你可能会说 Python 还是不行啊。等一等,我们还有优化的空间,就是 Python 的 for 循环,那可是 1000 万的循环,对此,Numba 提供了 prange 参数来并行计算,从而并发处理循环语句,只需要将 range 修改为 prange,装饰器传个参数:parallel = True,其他不变,代码改动如下:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;"><span style="font-weight: bold;line-height: 26px;">import</span> math<br  /><span style="font-weight: bold;line-height: 26px;">import</span> time<br  /><span style="font-weight: bold;line-height: 26px;">from</span> numba <span style="font-weight: bold;line-height: 26px;">import</span> njit, prange<br  /><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@njit</span><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;">is_prime</span><span style="line-height: 26px;">(num)</span>:</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num == <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</span><br  />    <span style="font-weight: bold;line-height: 26px;">if</span> num <= <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span> <span style="font-weight: bold;line-height: 26px;">or</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>:<br  />        <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> div <span style="font-weight: bold;line-height: 26px;">in</span> range(<span style="color: rgb(0, 128, 128);line-height: 26px;">3</span>, int(math.sqrt(num) + <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span>), <span style="color: rgb(0, 128, 128);line-height: 26px;">2</span>):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> <span style="font-weight: bold;line-height: 26px;">not</span> num % div:<br  />            <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">False</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> <span style="color: rgb(0, 128, 128);line-height: 26px;">True</span><br  /><br  /><span style="color: rgb(153, 153, 153);font-weight: bold;line-height: 26px;">@njit(parallel = True)</span><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;">run_program</span><span style="line-height: 26px;">(N)</span>:</span><br  />    total = <span style="color: rgb(0, 128, 128);line-height: 26px;">0</span><br  />    <span style="font-weight: bold;line-height: 26px;">for</span> i <span style="font-weight: bold;line-height: 26px;">in</span> prange(N):<br  />        <span style="font-weight: bold;line-height: 26px;">if</span> is_prime(i):<br  />            total += <span style="color: rgb(0, 128, 128);line-height: 26px;">1</span><br  />    <span style="font-weight: bold;line-height: 26px;">return</span> total<br  /><br  /><br  /><span style="font-weight: bold;line-height: 26px;">if</span> __name__ == <span style="color: rgb(221, 17, 68);line-height: 26px;">"__main__"</span>:<br  />    N = <span style="color: rgb(0, 128, 128);line-height: 26px;">10000000</span><br  />    start = time.time()<br  />    total = run_program(N)<br  />    end = time.time()<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"total prime num is <span style="color: rgb(51, 51, 51);line-height: 26px;">{total}</span>"</span>)<br  />    print(<span style="color: rgb(221, 17, 68);line-height: 26px;">f"cost <span style="color: rgb(51, 51, 51);line-height: 26px;">{end - start}</span>s"</span>)<br  /></span></section>
现在运行一下:
<section style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(51, 51, 51);display: -webkit-box;font-size: 12px;background: rgb(248, 248, 248);border-radius: 5px;font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;"><span style="font-size: 16px;">python isPrime.py<br  />total prime num is 664579<br  />cost 1.4398791790008545s<br  /></span></section>
才 1.43 秒,比 C++ 还快,Numba 真的牛逼!我又运行了两次,确认自己没看错,平均就是 1.4 秒:
Python可以比C++更快,你不信?
Python
看到这里,Numba 又让我燃起了对 Python 的激情,我不转 C++ 了,Python 够用了。
Numba 如何做到的呢?官方文档这样介绍:它读取装饰函数的 Python 字节码,并将其与有关函数输入参数类型的信息结合起来,分析和优化代码,最后使用编译器库(LLVM)针对你的 CPU 生成量身定制的机器代码。每次调用函数时,都会使用此编译版本,你说牛逼不?
Numba 还有更多详细的用法,这里不多说,想了解的请移步官方文档[1]

最后的话

Python 几乎在每一个领域都有对应的解决方案,本文提到的 Numba 库就是专门解决 Python 在计算密集型任务方面性能不足的问题,如果你从事机器学习、数据挖掘等领域,这个会非常有帮助,如果本文对你有用,请点赞、在看、关注支持。

<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;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">推荐阅读:</span></strong></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;"><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">入门: </span><span style="max-width: 100%;color: rgb(2, 30, 170);text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">最全的零基础学Python的问题</span><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">  | </span><span style="max-width: 100%;color: rgb(2, 30, 170);text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">零基础学了8个月的Python </span> <span style="max-width: 100%;color: rgb(2, 30, 170);text-decoration: underline;font-size: 15px;box-sizing: border-box !important;overflow-wrap: break-word !important;">|</span> <span style="max-width: 100%;text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">实战项目</span> <span style="max-width: 100%;text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">|学Python就是这条捷径</span></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><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;"><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">干货:</span><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);text-decoration: underline;box-sizing: border-box !important;overflow-wrap: break-word !important;">爬取豆瓣短评,电影《后来的我们》</span> | <span style="max-width: 100%;font-size: 14px;text-decoration: underline;box-sizing: border-box !important;overflow-wrap: break-word !important;">38年NBA最佳球员分析 </span><span style="max-width: 100%;font-size: 15px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;text-decoration: underline;box-sizing: border-box !important;overflow-wrap: break-word !important;">|</span>   </span><span style="max-width: 100%;font-size: 15px;text-decoration: underline;box-sizing: border-box !important;overflow-wrap: break-word !important;">从万众期待到口碑扑街!唐探3令人失望</span>  | 笑看新倚天屠龙记 | 灯谜答题王 |<span style="max-width: 100%;font-size: 14px;text-decoration: underline;box-sizing: border-box !important;overflow-wrap: break-word !important;">用Python做个海量小姐姐素描图 |</span></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><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;"><span style="max-width: 100%;font-size: 15px;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">趣味:</span><span style="max-width: 100%;color: rgb(2, 30, 170);text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">弹球游戏</span>  | <span style="max-width: 100%;text-decoration: underline;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">九宫格</span>  | 漂亮的花 | 两百行Python《天天酷跑》游戏!</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><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;"><span style="max-width: 100%;color: rgb(2, 30, 170);box-sizing: border-box !important;overflow-wrap: break-word !important;">AI:</span> 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影</p>


年度爆款文案

  • 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-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;text-size-adjust: auto;color: rgb(62, 62, 62);font-weight: 700;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/06/wxsync-2022-06-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/06/wxsync-2022-06-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;font-size: 15px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;white-space: pre-wrap;font-size: 12px;box-sizing: border-box !important;overflow-wrap: break-word !important;">点阅读原文,领廖雪峰大数据视频资料!</span></span></section></section></section></section></section></section></section>

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

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

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

你可能也喜欢

热评文章

发表评论

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