怎么用最短时间高效而踏实的学习python
发布时间:2025-05-11 17:52:50 发布人:远客网络
一、怎么用最短时间高效而踏实的学习python
1、不管学习什么新的东西,效率最低但是又不可或缺的环节就是看教科书了。虽然看书的过程可能会很无聊,但是过一遍书至少能对整个知识框架有个大体的把握。我最早知道 Python还是在《黑客与画家》这本书中看到的,书里面有一章节是讲编程语言的,作者很推荐把 python作为学习编程的入门语言。我当时是把《简明 Python教程》给过了一边,后来又看了一遍《深入python》,这里特别推荐《深入 Python》,除了介绍 python的基本特性之外,还介绍了诸如函数编程、正则表达式、处理 HTML和 XML等高级用法。除了看书,上公开课也是挺不错的,视频教学本来就比自己啃教科书有意思,而且完成课程作业也能锻炼动手编程能力。我上过两门不错的公开课,一门是莱斯大学在 Coursera上开的《Python交互式编程导论》,一边学 python,一边写些小游戏,肯定不会觉得无聊;另一门就是 MIT在 edX上开的《计算机科学及python编程导论》,它是 MIT edX系列课程(XSeries)中的第一课,系列课程共两门,除了这门课以外还有《计算思维及数据科学导论》,不过第二门就没有上过了。
2、《计算机科学及python编程导论》
3、另外,我和题主的情况有点像,也不是学计算机专业的,并且同样对自己的专业不感兴趣,以后也是想从事与数据科学相关的工作。我目前的状况都是在自学,上公开课,看教科书,跟大牛们的技术博客。
二、如何高效地使用Python统计数据的频率
之前用 Python写过一个脚本,用来处理上千万用户的一些数据,其中有一个需求是统计用户的某一数据的去重数量。为了加快程序的速度,我启用了多进程。但不幸的是,程序跑了近一个星期,还没处理完。这时,我感觉到了不对,于是开始查看程序的性能瓶颈。
对于统计去重数,我是将用户的数据放到一个列表中,然后用 len(set(data))去统计去重数量。刚开始我以为这的数据量并不大,每个用户的数据不会过百,我并没有注意到有的用户会有上万条的数据,因此消耗了大量的时间(其实我的脚本消耗时间最大的地方是因为从远程 redis中取大量数据时发生长时间的阻塞,甚至连接超时,最后我采用的方式分而治之,每次取少量的数据,这样大大的提高了性能)。
为了做优化,我开始寻求高效的方法。我发现,有大量的人认为采用字典效率会更高,即:
data_unique={}.fromkeys(data).keys() len(data_unique)
In [1]: import random In [2]: data= [random.randint(0, 1000) for _ in xrange(1000000)] In [3]:%timeit len(set(data)) 10 loops, best of 3: 39.7 ms per loop In [4]:%timeit len({}.fromkeys(data).keys()) 10 loops, best of 3: 43.5 ms per loop
由此可见,采用字典和采用集合的性能是差不多的,甚至可能还要慢些。
在 Python中其实有很多高效的库,例如用 numpy、pandas来处理数据,其性能接近于 C语言。那么,我们就用 numpy和 pandas来解决这个问题,这里我还比较了获取去重数据的性能,代码如下:
import collections import random as py_random import timeit import numpy.random as np_random import pandas as pd DATA_SIZE= 10000000 def py_cal_len(): data= [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)] len(set(data)) def pd_cal_len(): data= np_random.randint(1000, size=DATA_SIZE) data= pd.Series(data) data_unique= data.value_counts() data_unique.size def py_count(): data= [py_random.randint(0, 1000) for _ in xrange(DATA_SIZE)] collections.Counter(data) def pd_count(): data= np_random.randint(1000, size=DATA_SIZE) data= pd.Series(data) data.value_counts()# Script starts from here if __name__=="__main__": t1= timeit.Timer("py_cal_len()", setup="from __main__ import py_cal_len") t2= timeit.Timer("pd_cal_len()", setup="from __main__ import pd_cal_len") t3= timeit.Timer("py_count()", setup="from __main__ import py_count") t4= timeit.Timer("pd_count()", setup="from __main__ import pd_count") print t1.timeit(number=1) print t2.timeit(number=1) print t3.timeit(number=1) print t4.timeit(number=1)
12.438587904 0.435907125473 14.6431810856 0.258564949036
利用 pandas统计数据的去重数和去重数据,其性能是 Python原生函数的 10倍以上。
三、优化Python编程的4个妙招
1. Pandas.apply()–特征工程瑰宝
Pandas库已经非常优化了,但是大部分人都没有发挥它的最大作用。想想它一般会用于数据科学项目中的哪些地方。一般首先能想到的就是特征工程,即用已有特征创造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函数。
在Pandas.apply()中,可以传递用户定义功能并将其应用到Pandas Series的所有数据点中。这个函数是Pandas库最好的扩展功能之一,它能根据所需条件分隔数据。之后便能将其有效应用到数据处理任务中。
2. Pandas.DataFrame.loc– Python数据操作绝妙技巧
所有和数据处理打交道的数据科学家(差不多所有人了!)都应该学会这个方法。
很多时候,数据科学家需要根据一些条件更新数据集中某列的某些值。Pandas.DataFrame.loc就是此类问题最优的解决方法。
另一种解决缓慢循环的方法就是将函数向量化。这意味着新建函数会应用于输入列表,并返回结果数组。在Python中使用向量化能至少迭代两次,从而加速计算。
事实上,这样不仅能加速代码运算,还能让代码更加简洁清晰。
多重处理能使系统同时支持一个以上的处理器。
此处将数据处理分成多个任务,让它们各自独立运行。处理庞大的数据集时,即使是apply函数也显得有些迟缓。
关于优化Python编程的4个妙招,青藤小编就和您分享到这里了。如果您对python编程有浓厚的兴趣,希望这篇文章可以为您提供帮助。如果您还想了解更多关于python编程的技巧及素材等内容,可以点击本站的其他文章进行学习。