<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>list.append &#8211; 编码无悔 /  Intent &amp; Focused</title>
	<atom:link href="https://www.codelast.com/tag/list-append/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codelast.com</link>
	<description>最优化之路</description>
	<lastBuildDate>Mon, 27 Apr 2020 17:38:25 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[原创] Python的list.append()比np.append()更快</title>
		<link>https://www.codelast.com/%e5%8e%9f%e5%88%9b-python%e7%9a%84list-append%e6%af%94np-append%e6%9b%b4%e5%bf%ab/</link>
					<comments>https://www.codelast.com/%e5%8e%9f%e5%88%9b-python%e7%9a%84list-append%e6%af%94np-append%e6%9b%b4%e5%bf%ab/#respond</comments>
		
		<dc:creator><![CDATA[learnhard]]></dc:creator>
		<pubDate>Thu, 28 Nov 2019 06:29:19 +0000</pubDate>
				<category><![CDATA[原创]]></category>
		<category><![CDATA[综合]]></category>
		<category><![CDATA[list.append]]></category>
		<category><![CDATA[np.append]]></category>
		<guid isPermaLink="false">https://www.codelast.com/?p=11084</guid>

					<description><![CDATA[<p>
在Python中，假设你最终想得到一个NumPy array，而它是通过append大量数据得到的，那么有两种办法：<br />
<span style="color:#0000ff;">✔</span> 先创建一个Python list，append完数据之后再把这个list转成NumPy array。<br />
<span style="color: rgb(0, 0, 255);">✔</span>&#160;直接创建一个NumPy array，用 np.append() 函数来append数据。<br />
第1种比第2种快很多，尤其是当你在一个for循环中频繁做这个事情的时候，差距就更明显了。<br />
<span id="more-11084"></span><br />
用下面的代码来实验：</p>
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Droid Sans Mono';font-size:13.5pt;">
<span style="color:#cc7832;">import </span>random
<span style="color:#cc7832;">import </span>time

r1 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">10</span>)
r2 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">20</span>)
r3 = random.sample(</pre>&#8230; <a href="https://www.codelast.com/%e5%8e%9f%e5%88%9b-python%e7%9a%84list-append%e6%af%94np-append%e6%9b%b4%e5%bf%ab/" class="read-more">Read More </a>]]></description>
										<content:encoded><![CDATA[<p>
在Python中，假设你最终想得到一个NumPy array，而它是通过append大量数据得到的，那么有两种办法：<br />
<span style="color:#0000ff;"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span> 先创建一个Python list，append完数据之后再把这个list转成NumPy array。<br />
<span style="color: rgb(0, 0, 255);"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span>&nbsp;直接创建一个NumPy array，用 np.append() 函数来append数据。<br />
第1种比第2种快很多，尤其是当你在一个for循环中频繁做这个事情的时候，差距就更明显了。<br />
<span id="more-11084"></span><br />
用下面的代码来实验：</p>
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Droid Sans Mono';font-size:13.5pt;">
<span style="color:#cc7832;">import </span>random
<span style="color:#cc7832;">import </span>time

r1 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">10</span>)
r2 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">20</span>)
r3 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">30</span>)
r4 = random.sample(<span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">1</span><span style="color:#cc7832;">, </span><span style="color:#6897bb;">100</span>)<span style="color:#cc7832;">, </span><span style="color:#6897bb;">40</span>)

start_time = time.time()
<span style="color:#cc7832;">for </span>_ <span style="color:#cc7832;">in </span><span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">100000</span>):
    a = []
    a.append(<span style="color:#6897bb;">3.5</span>)
    a.append(<span style="color:#6897bb;">5.1</span>)
    a.append(<span style="color:#6897bb;">0.2</span>)
    a.append(<span style="color:#6897bb;">4.6</span>)
    a.append(<span style="color:#6897bb;">20.3</span>)
    a.append(<span style="color:#6897bb;">2.5</span>)
    a.extend(r1)
    a.extend(r2)
    a.extend(r3)
    a.extend(r4)
    b = np.asarray(a<span style="color:#cc7832;">, </span><span style="color:#aa4926;">dtype</span>=np.float32)

<span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">f&#39;list.append() used: </span><span style="color:#cc7832;">{</span>time.time() - start_time<span style="color:#cc7832;">}</span><span style="color:#6a8759;"> seconds&#39;</span>)


start_time = time.time()
<span style="color:#cc7832;">for </span>_ <span style="color:#cc7832;">in </span><span style="color:#8888c6;">range</span>(<span style="color:#6897bb;">100000</span>):
    a = np.array([]<span style="color:#cc7832;">, </span><span style="color:#aa4926;">dtype</span>=np.float32)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">3.5</span>)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">5.1</span>)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">0.2</span>)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">4.6</span>)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">20.3</span>)
    a = np.append(a<span style="color:#cc7832;">, </span><span style="color:#6897bb;">2.5</span>)
    a = np.append(a<span style="color:#cc7832;">, </span>r1)
    a = np.append(a<span style="color:#cc7832;">, </span>r2)
    a = np.append(a<span style="color:#cc7832;">, </span>r3)
    a = np.append(a<span style="color:#cc7832;">, </span>r4)

<span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">f&#39;np.append() used: </span><span style="color:#cc7832;">{</span>time.time() - start_time<span style="color:#cc7832;">}</span><span style="color:#6a8759;"> seconds&#39;</span>)</pre>
<p><span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
结果：</p>
<blockquote>
<div>
		list.append() used: 0.872962236404419 seconds</div>
<div>
		np.append() used: 5.864704847335815 seconds</div>
</blockquote>
<div>
	可见第1种方法速度快太多了。而且append的数据越多，差距可能就越明显。<br />
	为什么会这样？不妨看看 np.append() 的文档：</p>
<blockquote>
<div>
			Returns</div>
<div>
			-------</div>
<div>
			append : ndarray</div>
<div>
			&nbsp; &nbsp; A copy of `arr` with `values` appended to `axis`.&nbsp; Note that</div>
<div>
			&nbsp; &nbsp; `append` does not occur in-place: a new array is allocated and</div>
<div>
			&nbsp; &nbsp; filled.</div>
</blockquote>
<p>	也就是说 np.append() 不是 in-place 的append，它会分配一块新的内存，再把数据copy到里面去。<br />
	为了计算高效，一个NumPy array在底层是存储在一块连续的内存区域里，所以在频繁进行 np.append() 的时候，会导致大量的 分配新内存&rarr;拷贝数据 的操作，从而严重拖慢运行速度。<br />
	相比之下，Python的list则对应的可能是不连续的内存区域，append起来速度就快得多。在list.append完成之后再转成NumPy array，只会发生一次 分配新内存&rarr;拷贝数据 的操作，速度自然就快得多了。<br />
	<span style="color: rgb(255, 255, 255);">文章来源：</span><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><span style="color: rgb(255, 255, 255);">https://www.codelast.com/</span></a><br />
	<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;版权声明&nbsp;<span style="color: rgb(255, 0, 0);">➤➤</span>&nbsp;<br />
	转载需注明出处：<u><a href="https://www.codelast.com/" rel="noopener noreferrer" target="_blank"><em><span style="color: rgb(0, 0, 255);"><strong style="font-size: 16px;"><span style="font-family: arial, helvetica, sans-serif;">codelast.com</span></strong></span></em></a></u>&nbsp;<br />
	感谢关注我的微信公众号（微信扫一扫）：</p>
<p style="border: 0px; font-size: 13px; margin: 0px 0px 9px; outline: 0px; padding: 0px; color: rgb(77, 77, 77);">
		<img decoding="async" alt="wechat qrcode of codelast" src="https://www.codelast.com/codelast_wechat_qr_code.jpg" style="width: 200px; height: 200px;" /></p>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codelast.com/%e5%8e%9f%e5%88%9b-python%e7%9a%84list-append%e6%af%94np-append%e6%9b%b4%e5%bf%ab/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
