Python2和Python3对比实验设计

一直有看到网上有讨论Python2和Python3的比较,最近公司也在考虑是否在spark-python大数据开发环境中升级到python3。通过本篇博文记录Python2.7.13和Pthon3.5.3的各方面比较。

环境配置

这里继续使用我们在之前博文里配置的环境。
因为是比较Python2和Python3差异,所以单纯升级Python版本无法解决,我通过pyenv和virtualenv两个工具来实现隔离的测试环境。
参考文档:使用pyenv和virtualenv搭建python虚拟环境使用 pyenv 可以在一个系统中安装多个python版本
配置的步骤如下:

  • 最开始是更新Tkinter,不然后续要重新再来一次,不要问我为什么知道...
sudo yum install tkinter -y
sudo yum install tk-devel tcl-devel -y
  • 更新pyenv依赖软件
sudo yum install readline readline-devel readline-static -y
yum install openssl openssl-devel openssl-static -y
yum install sqlite-devel -y
yum install bzip2-devel bzip2-libs -y
  • 下载安装pyenv,并下载python2.7.13和python3.5.3
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
chgmod 777 -R ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
exec $SHELL
source ~/.bash_profile 

pyenv  install --list
pyenv install -v 2.7.13
pyenv install -v 3.5.3
  • 下载安装pyenv-virtualenv,并安装两个隔离环境
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv   
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile
pyenv virtualenv 2.7.13 py2
pyenv virtualenv 3.5.3 py3

好,到此基本搞定两个隔离的python环境,测试如下,我们可以发现当前的python环境从centos7默认的2.7.5切换到2.7.13再切换到3.5。

[kejun@localhost ~]$ python -V
Python 2.7.5
[kejun@localhost ~]$ pyenv activate py2
(py2) [kejun@localhost ~]$ python -V
Python 2.7.13
(py2) [kejun@localhost ~]$ pyenv deactivate
[kejun@localhost ~]$ pyenv activate py3
(py3) [kejun@localhost ~]$ python -V
Python 3.5.

详细测试:

我们安装了常用的数据分析第三方工具包,并做了安装测试和样例测试,样例测试的脚本见最下。

分类 工具名 用途
数据收集 scrapy 网页采集,爬虫
数据收集 scrapy-redis 分布式爬虫
数据收集 selenium web测试,仿真浏览器
数据处理 beautifulsoup 网页解释库,提供lxml的支持
数据处理 lxml xml解释库
数据处理 xlrd excel文件读取
数据处理 xlwt excel文件写入
数据处理 xlutils excel文件简单格式修改
数据处理 pywin32 excel文件的读取写入及复杂格式定制
数据处理 Python-docx Word文件的读取写入
数据分析 numpy 基于矩阵的数学计算库
数据分析 pandas 基于表格的统计分析库
数据分析 scipy 科学计算库,支持高阶抽象和复杂模型
数据分析 statsmodels 统计建模和计量经济学工具包
数据分析 scikit-learn 机器学习工具库
数据分析 gensim 自然语言处理工具库
数据分析 jieba 中文分词工具库
数据存储 MySQL-python mysql的读写接口库
数据存储 mysqlclient mysql的读写接口库
数据存储 SQLAlchemy 数据库的ORM封装
数据存储 pymssql sql server读写接口库
数据存储 redis redis的读写接口
数据存储 PyMongo mongodb的读写接口
数据呈现 matplotlib 流行的数据可视化库
数据呈现 seaborn 美观的数据可是湖库,基于matplotlib
工具辅助 jupyter 基于web的python IDE,常用于数据分析
工具辅助 chardet 字符检查工具
工具辅助 ConfigParser 配置文件读写支持
工具辅助 requests HTTP库,用于网络访问
# encoding=utf-8
import sys
import platform
import traceback
import gc
import ctypes  

  
STD_OUTPUT_HANDLE= -11  
FOREGROUND_BLACK = 0x0  
FOREGROUND_BLUE = 0x01 # text color contains blue.  
FOREGROUND_GREEN= 0x02 # text color contains green.  
FOREGROUND_RED = 0x04 # text color contains red.  
FOREGROUND_INTENSITY = 0x08 # text color is intensified.  
  
class WinPrint:
    """
    提供给Windows打印彩色字体使用
    """

    std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)  
      
    def set_cmd_color(self, color, handle=std_out_handle):  
        bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)  
        return bool  
      
    def reset_color(self):  
        self.set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)  
      
    def print_red_text(self, print_text):  
        self.set_cmd_color(FOREGROUND_RED | FOREGROUND_INTENSITY)  
        print (print_text)  
        self.reset_color()  
          
    def print_green_text(self, print_text):  
        self.set_cmd_color(FOREGROUND_GREEN | FOREGROUND_INTENSITY)  
        print (print_text)  
        self.reset_color()  

class UnixPrint:
    """
    提供给Centos打印彩色字体
    """
    def print_red_text(self, print_text): 
        print('\033[1;31m%s\033[0m'%print_text)
    
    def print_green_text(self, print_text): 
        print('\033[1;32m%s\033[0m'%print_text)

py_env = "Python2" if sys.version.find("2.7") > -1 else "Python3"
sys_ver = "Windows" if platform.system().find("indows") > -1 else "Centos"
my_print = WinPrint() if platform.system().find("indows") > -1 else UnixPrint()


def check(sys_ver, py_env):
    """
    装饰器,统一输入输出
    顺便测试带参数的装饰器,非必须带参数
    """
    def _check(func):
        def __check():
            try:
                func()
                my_print.print_green_text(
                    "[%s,%s]: %s pass." % (sys_ver, py_env, func.__name__))
            except:
                traceback.print_exc()
                my_print.print_red_text(
                    "[%s,%s]: %s fail." % (sys_ver, py_env, func.__name__))
        return __check
    return _check


def make_requirement(filepath, filename):
    """
    处理pip requirements文件
    """
    result = []
    with open(filepath + "\\" + filename, "r") as f:
        data = f.readlines()

        for line in data:
            if line.find("==") > -1:
                result.append(line.split("==")[0] + "\n")
            else:
                result.append(line + "\n")
    with open(filepath + "\\" + filename.split(".")[0] + "-clean.txt",
              "w") as f1:
        f1.writelines(result)


@check(sys_ver, py_env)
def test_scrapy():
    from scrapy import signals
    from selenium import webdriver
    from scrapy.http import HtmlResponse
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.webdriver.common.keys import Keys
    from selenium.common.exceptions import NoSuchElementException
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait


@check(sys_ver, py_env)
def test_matplotlib():
    import matplotlib.pyplot as plt
    l = [1, 2, 3, 4, 5]
    h = [20, 14, 38, 27, 9]
    w = [0.1, 0.2, 0.3, 0.4, 0.5]
    b = [1, 2, 3, 4, 5]
    fig = plt.figure()
    ax = fig.add_subplot(111)
    rects = ax.bar(l, h, w, b)
    # plt.show()


@check(sys_ver, py_env)
def test_beautifulSoup():
    from bs4 import BeautifulSoup
    html_str = "<html><meta/><head><title>Hello</title></head><body onload=crash()>Hi all<p></html>"
    soup = BeautifulSoup(html_str, "lxml")
    # print (soup.get_text())


@check(sys_ver, py_env)
def test_lxml():
    from lxml import html
    html_str = "<html><meta/><head><title>Hello</title></head><body onload=crash()>Hi all<p></html>"
    html.fromstring(html_str)


@check(sys_ver, py_env)
def test_xls():
    import xlrd
    import xlwt
    from xlutils.copy import copy
    excel_book2 = xlwt.Workbook()
    del excel_book2
    excel_book1 = xlrd.open_workbook("1.xlsx")
    del excel_book1
    import docx
    doc = docx.Document("1.docx")
    # print (doc)
    del doc
    gc.collect()


@check(sys_ver, py_env)
def test_data_analysis():
    import pandas as pd
    import numpy as np
    data_list = np.array([x for x in range(100)])
    data_serial = pd.Series(data_list)
    # print (data_serial)
    from scipy import fft
    b = fft(data_list)
    # print (b)


@check(sys_ver, py_env)
def test_statsmodels():
    import statsmodels.api as sm
    data = sm.datasets.spector.load()
    data.exog = sm.add_constant(data.exog, prepend=False)
    # print data.exog


@check(sys_ver, py_env)
def test_sklearn():
    from sklearn import datasets
    iris = datasets.load_iris()
    data = iris.data
    # print(data.shape)


@check(sys_ver, py_env)
def test_gensim():
    import warnings
    warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')
    from gensim import corpora
    from collections import defaultdict
    documents = ["Human machine interface for lab abc computer applications",
                 "A survey of user opinion of computer system response time",
                 "The EPS user interface management system",
                 "System and human system engineering testing of EPS",
                 "Relation of user perceived response time to error measurement",
                 "The generation of random binary unordered trees",
                 "The intersection graph of paths in trees",
                 "Graph minors IV Widths of trees and well quasi ordering",
                 "Graph minors A survey"]
    stoplist = set('for a of the and to in'.split())
    texts = [[word for word in document.lower().split() if word not in stoplist]
             for document in documents]
    frequency = defaultdict(int)
    for text in texts:
        for token in text:
            frequency[token] += 1
    texts = [[token for token in text if frequency[token] > 1]
             for text in texts]
    dictionary = corpora.Dictionary(texts)
    dictionary.save('deerwester.dict')


@check(sys_ver, py_env)
def test_jieba():
    import jieba
    seg_list = jieba.cut("我来到了北京参观天安门。", cut_all=False)
    # print("Default Mode: " + "/ ".join(seg_list))  # 精确模式


@check(sys_ver, py_env)
def test_mysql():
    import MySQLdb as mysql
    #测试pet_shop连接
    db = mysql.connect(host="xx", user="yy", passwd="12345678", db="zz")
    cur = db.cursor()
    sql="select id from role;"
    cur.execute(sql)
    result = cur.fetchall()
    db.close()
    # print (result)


@check(sys_ver, py_env)
def test_SQLAlchemy():
    from sqlalchemy import Column, String, create_engine,Integer
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    engine = create_engine('mysql://xxx/yy',echo=False)
    DBSession = sessionmaker(bind=engine)
    Base = declarative_base()
    class rule(Base):
        __tablename__="role"
        id=Column(Integer,primary_key=True,autoincrement=True)
        role_name=Column(String(100))
        role_desc=Column(String(255))
    new_rule=rule(role_name="test_sqlalchemy",role_desc="forP2&P3")
    session=DBSession()
    session.add(new_rule)
    session.commit()
    session.close()


@check(sys_ver, py_env)
def test_redis():
    import redis 
    pool = redis.Redis(host='127.0.0.1', port=6379) 

@check(sys_ver, py_env)
def test_requests():
    import requests
    r=requests.get(url="http://www.cnblogs.com/kendrick/")
    # print (r.status_code)


@check(sys_ver, py_env)
def test_PyMongo():
    from pymongo import MongoClient
    conn=MongoClient("localhost",27017)

if __name__ == "__main__":
    print ("[%s,%s]  start checking..." % (sys_ver, py_env))
    test_scrapy()
    test_beautifulSoup()
    test_lxml()
    test_matplotlib()
    test_xls()
    test_data_analysis()
    test_sklearn()
    test_mysql()
    test_SQLAlchemy()
    test_PyMongo()
    test_gensim()
    test_jieba()
    test_redis()
    test_requests()
    test_statsmodels()
    print ("[%s,%s]  finish checking." % (sys_ver, py_env))



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容