Cloud

Cloud 查看完整档案

上海编辑  |  填写毕业院校  |  填写所在公司/组织 zuyunfei.com 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

Cloud 发布了文章 · 7月14日

Shell 截取文件名和后缀

本文首发于个人博客http://zuyunfei.com/2016/03/2...,欢迎阅读最新内容!

截取文件名和后缀

编写Shell脚本的过程中,经常会和文件名和文件路径打交道。如果用户输入了一个文件的全名(可能包含绝对路径和文件后缀),如何得到文件的路径名,文件名,文件后缀这些信息呢。Shell脚本拥有强大的字符串处理能力,如果把文件名当做字符串,我们不难使用cut或sed这样的工具得到我们想要的结果。

$fullfile=/the/path/foo.txt
$fullname=$(basename $fullfile)
$dir=$(dirname $fullfile)
$filename=$(echo $fullname | cut -d . -f1)
$extension=$(echo $fullname | cut -d . -f2)
$ echo $dir , $fullname , $filename , $extension
/the/path , foo.txt , foo , txt

这里使用basename命令可以直接得到包含后缀的文件名,而dirname命令可以得到路径名,然后就能简单的用cut截取文件名和后缀名。

更复杂的情况

如果对付简单应用场景,到这里已经可以打完收工了,但是有时候文件可能不止有一个后缀,比如*.tar.gz,怎样得到最后一个后缀呢?再cut一回?当然可以,但是如果文件名是mylib.1.0.1a.zip这样的呢?呃......正则表达式肯定可以。

$ fullname=mylib.1.0.1a.zip
$ filename=$(echo $fullname | sed 's/\.[^.]*$//')
$ extension=$(echo $fullname | sed 's/^.*\.//')
$ echo $filename, $extension
mylib.1.0.1a, zip

这里面的逻辑是这样的:

  • 文件名:把以.字符开头以后一直到行尾都是非.字符的子串替换为空。
  • 后缀名:把从行首开始以.字符结尾的子串替换为空。

光用语言把这两个正则表达式描述出来脑细胞也要死不少。有没有像上面cut版本一样简单容易理解的方法呢?由于.分隔符的个数不确定,正常使用cut来分割最后一个.字符是不太可能的。但是我们可使用 rev 命令将字符串反转一下,区分后缀和文件名的.字符位置就确定了。截取了想要的部分之后,再次反转就得到了我们想要的内容。

$ fullname=mylib.1.0.1a.zip
$ filename=$(rev <<< $fullname | cut -d . -f2- | rev)
$ extension=$(rev <<< $fullname | cut -d . -f1 | rev)
$ echo $filename, $extension
mylib.1.0.1a, zip

使用参数扩展

其实不借助复杂的正则表达式,甚至不调用basename, dirname, cut, sed命令,shell脚本一样可以做到所有的操作。看下面的实现:

$ fullfile=/the/path/mylib.1.0.1a.zip
$ fullname="${fullfile##*/}"
$ dir="${fullfile%/*}"
$ extension="${fullname##*.}"
$ filename="${fullname%.*}"
$ echo $dir , $fullname , $filename , $extension
/the/path , mylib.1.0.1a.zip , mylib.1.0.1a , zip

真是不能再简洁了,大括号之内变量名配合几个神奇的字符,就是Shell的参数扩展(Parameter Extension)功能。

  • ${fullfile##*/}:从前面开始删除fullfile中最大匹配(longest matching pattern) */ 的字符串
  • ${fullfile%/*}:从后面开始删除fullfile中最小匹配(shortest matching pattern) /* 的字符串
  • ${fullname##*.}:从前面开始删除fullname中最大匹配(longest matching pattern) *. 的字符串
  • ${fullname%.*}:从后面开始删除fullname中最小匹配(shortest matching pattern) .* 的字符串

参数扩展有多种形式,在shell编程中可以用作参数的拼接,字符串的替换,参数列表截取,变量初值等操作,这里不再详述,请参考后面的功能列表和官方文档

参数扩展功能列表

参数形式扩展后
x{y,z}xy xz
${x}{y, z}${x}y ${x}z
${x}{y, $z}${x}y ${x}${z}
${param#pattern}从param前面删除pattern的最小匹配
${param##pattern}从param前面删除pattern的最大匹配
${param%pattern}从param后面删除pattern的最小匹配
${param%%pattern}从param后面删除pattern的最大匹配
${param/pattern/string}从param中用string替换pattern的第一次匹配,string可为空
${param//pattern/string}从param中用string替换pattern的所有匹配,string可为空
${param:3:2}截取$param中索引3开始的2个字符
${param:3}截取$param中索引3至末尾的字符
${@:3:2}截取参数列表$@中第3个开始的2个参数
${param:-word}若$param为空或未设置,则参数式返回word,$param不变
${param:+word}若$param为非空,则参数式返回word,$param不变
${param:=word}若$param为空或为设置,则参数式返回word,同时$param设置为word
${param:?message}若$param为空或为设置,则输出错误信息message,若包含空白符,则需引号
查看原文

赞 1 收藏 1 评论 0

Cloud 发布了文章 · 7月14日

目标检测中的mAP

本文首发于个人博客http://zuyunfei.com/2020/07/0...,欢迎阅读最新内容!

如何衡量目标检测算法的优劣

目标检测(object detection)问题相对于一般AI分类问题更加复杂,不仅检测出目标,输出目标的类别,还要定位出目标的位置。分类问题中的简单accuray指标已经不能反映出目标检测问题结果的准确度,而mAP (Mean Average Precision)就是被用来衡量目标检测算法优劣的常用指标。
要理解什么是mAP,需要先澄清什么是Precision(查准率)和Recall(查全率)。

Precision和Recall

定义

查准率和查全率是在信息检索、Web搜索等应用中经常出现的性能度量指标,在机器学习中,也可以用来度量“预测结果中有多少比例是用户感兴趣的”。对于二分类问题,可将样例根据其真实类别与预测类别的组合划分为:

TP、TN、FP、FN

  • TP (True Positive): 真正例。Positive指预测输出为正,True代表预测正确。
  • TN (True Negative): 真反例。预测输出为负,而且预测正确。
  • FP (False Positive): 假正例。预测输出为正,但是预测错误。
  • FN (False Negative): 假反例。预测输出为负,但是预测错误。

image

Precision

Precision(查准率): 所有预测为正例的结果中,预测正确的比率。

formula_precision.jpg

Recall

Recall (查全率):所有正例中被正确预测的比率。
formula_recall.jpg

如何计算

目标检测问题中,算法通常输出一个预测框(bounding box)来标识检出目标的位置,要衡量这个预测框与目标的实际位置(ground truth)的准确度,可以使用IoU指标。

交并比IoU(Intersection over union)

交并比IoU衡量的是两个区域的重叠程度,是两个区域重叠部分面积占二者总面积(重叠部分只计算一次)的比例。

iou.png

目标检测中IoU就是预测框与实际框的交集除以并集
我们可以设置一个阈值(threshold),通常是0.5,预测结果可以分为:

  • 如果IoU >= 0.5

    • 如果预测类别也正确,认为是一个好的预测,分类为TP
    • 如果预测类别错误,认为是一个坏的预测,分类为FP
  • 如果IoU < 0.5, 认为是一个坏的预测,分类为FP
  • 如果一个目标出现在图像中,但是算法未检出,分类为FN
  • TN(图像上所有不包含实际框和检测框的部分)通常计算中用不到。

AP和mAP

P-R曲线

查全率和查准率通常是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。
我们如果把所有预测结果对样例进行排序,排在前面的是“最可能”的正例样本,以查准率为纵轴、查全率为横轴作图,得到一条”P-R曲线”。

pr_curve.png

P-R曲线直观的显示出一个算法在样本总体上的查全率、查准率情况。如果一个算法的P-R曲线被另一个算法的曲线完全包住,则可断言后者优于前者。但是实际中,经常不同算法的P-R曲线是互相交叉的,这时就很难直观判断出两者的优劣。这时通常会考察平衡点(BEP)、F1度量、AP等指标。

AP

AP(average precision 平均精度):AP是计算单类别的模型平均准确度。对于目标检测任务,每一个类都可以计算出其Precision和Recall,每个类都可以得到一条P-R曲线,曲线下的面积就是AP的值。如果一个算法的AP值较大,也就是P-R曲线下的面积比较大,可以认为此算法查准率和查全率整体上相对
formula_ap.jpg

mAP

mAP(mean of Average Precision) : 对所有类别的AP值求平均值。

Pascal VOC(VOC2007 & VOC2012)是评测目标检测算法的常用数据集,VOC数据集使用一个固定的IoU阈值0.5来计算AP值。 但是在2014年之后,MS-COCO(Microsoft Common Objects)数据集逐渐兴起。 在COCO数据集中,更关注预测框位置的准确性,AP值是针对多个IoU阈值的AP平均值,具体的就是在0.5 和0.95之间取10个IoU阈值(0.5、0.55、0.6 ..... 0.9、0.95)。所以VOC数据集中mAP通常标记为mAP @ IoU=0.5, mAP@0.5 或者 mAP_50,在COCO 数据集中册标记为 mAP @ IoU=0.5:0.05:0.95, mAP @ IoU=0.5:0.95 或者 mAP@[0.5:0.95].

参考:

https://blog.csdn.net/weixin_44791964/article/details/102414522
https://www.jianshu.com/p/fecc98e448d9

查看原文

赞 0 收藏 0 评论 0

Cloud 发布了文章 · 7月14日

在CORE-3399PRO-JD4上编译安装pytorch和opencv

本文首发于个人博客 http://zuyunfei.com/2020/07/1...,欢迎阅读最新内容!

最近拿到一块CORE-3399PRO-JD4开发板,要在上面部署AI应用。这块板子搭载Rockchip RK3399Pro处理器,采用双核 Cortex-A72+四核 Cortex-A53构架,主频高达 1.8GHz,集成四核Mali-T864 GPU,并内置高性能NPU,号称性能优异。但是实际过程中,发现发热严重,要使用NPU需要把算法移植到Rockchip提供的RKNN-Toolkit开发套件。按照官方文档把板子刷成了ubuntu18.4,然后安装了RKNN,打算把现有模型转换一下,结果发现:

  • 适配的tensorflow版本较低(RKNN 1.3 支持tensorflow 1.10.1),2.0版本的模型无法转换。
  • ONNX版本模型转换失败,应该也是版本不对
  • pytorch干脆没有迁移到板子上,官方例程都跑不起来。

实在没办法,只能先不用NPU把应用跑起来试试。这里把编译在ARM Ubuntu18.04上编译pytorch和opencv的过程记录一下。

编译pytorch

在开发板上编译,需要先安装编译工具链(要联网)。因为开始编译前我已经折腾这块板子好多天了,下面列出的依赖可能不是全部。

sudo apt-get install libopenblas-dev libblas-dev m4 cmake cython

然后安装python依赖,我这里使用的是python3.6。

pip3 install numpy pyyaml cyphon

从gitbub拿下来pytorch源码,submodule update 过程必不可少。

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
git checkout v1.4
git submodule sync
git submodule update --init --recursive
git submodule update --remote third_party/protobuf

配置环境变量

export NO_CUDA=1          #不适用cuda
export NO_DISTRIBUTED=1   #不支持分布式
export NO_MKLDNN=1        #不支持MKLDNN
export MAX_JOBS=4 

需要注意的是MAX_JOBS是并行编译的最大线程数。(虽然CORE-3399PRO-JD4 这块板子是6核CPU,可以支持6线程编译,但是它只有4GB内存,编译一些复杂模块时,GCC会耗尽内存崩溃。我的经验是先用4线程或6线程编译,遇到GCC崩溃,再改回单线程编译,耗内存的模块编译过之后再改回6线程编译。)

开始编译

#打包成whl,打包成功后这个文件在dist目录里面
python setup.py bdist_wheel

安装编译好的wheel包

cd dist
pip3 install ./torch-1.4.0a0+72e1771-cp36-cp36m-linux_aarch64.whl

编译torchvision

先安装编译依赖

sudo apt-get install libjpeg-dev libavcodec-dev libavformat-dev libswscale-dev
pip3 install pillow

从gitbub clone 代码

git clone https://github.com/pytorch/vision.git
cd vision
git checkout v0.5

开始编译

#打包成whl
python setup.py bdist_wheel

安装

cd dist
pip3 install ./torchvision-0.5.0a0+85b8fbf-cp36-cp36m-linux_aarch64.whl

编译OpenCV

ubuntu 18.04 可以直接用 apt 安装opencv 3.2,但是我们之前的一个应用至少需要3.3版本,所以也需要重新编译。
首先安装工具链

sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

下载OpenCV和opencv_conrib 源码

wget -O opencv-3.3.0.zip https://github.com/opencv/opencv/archive/3.3.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.3.0.zip
unzip opencv-3.3.0.zip
unzip opencv_contrib.zip
cd opencv-3.3.0

配置cmake

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=OFF \
      -D OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib-3.3.0/modules \
      -D PYTHON_EXECUTABLE=/usr/bing/python3 \
      -D BUILD_EXAMPLES=ON ..

开始编译

make -j 4

打包和安装

make package
sudo make install

软件包下载

由于是在开发板上编译,PyTorch花费了大概4个小时,OpenCV也需要1个小时。我把编译好的包上传到了github,有需要的可以直接下载:

查看原文

赞 0 收藏 0 评论 0

Cloud 发布了文章 · 6月17日

非极大值抑制(Non-Maximum Suppression)

本文首发于个人博客http://zuyunfei.com/2020/06/1...,欢迎阅读最新内容!

定义

在模型预测阶段,我们先为图像生成多个锚框,并为这些锚框一一预测类别和偏移量。随后,我们根据锚框及其预测偏移量得到预测边界框。当锚框数量较多时,同一个目标上可能会输出较多相似的预测边界框。了使结果更加简洁,我们可以移除相似的预测边界框。常用的方法叫作非极大值抑制(non-maximum suppression,NMS)。

计算流程

非极大值抑制的流程如下:

  • 根据置信度得分进行排序
  • 选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除
  • 计算所有边界框的面积
  • 计算置信度最高的边界框与其它候选框的IoU。
  • 删除IoU大于阈值的边界框
  • 重复上述过程,直至边界框列表为空。

代码实现

下面的实现代码摘自《动手学深度学习(TF2.0版)

from collections import namedtuple
Pred_BB_Info = namedtuple("Pred_BB_Info", 
        ["index", "class_id", "confidence", "xyxy"])

def non_max_suppression(bb_info_list, nms_threshold=0.5):
    """
    非极大抑制处理预测的边界框
    Args:
        bb_info_list: Pred_BB_Info的列表, 包含预测类别、置信度等信息
        nms_threshold: 阈值
    Returns:
        output: Pred_BB_Info的列表, 只保留过滤后的边界框信息
    """
    output = []
    # 现根据置信度从高到底排序
    sorted_bb_info_list = sorted(bb_info_list,
                    key = lambda x: x.confidence, 
                    reverse=True)
    while len(sorted_bb_info_list) != 0:
        best = sorted_bb_info_list.pop(0)
        output.append(best)

        if len(sorted_bb_info_list) == 0:
            break
        bb_xyxy = []
        for bb in sorted_bb_info_list:
            bb_xyxy.append(bb.xyxy)

        iou = compute_jaccard(tf.convert_to_tensor(best.xyxy),
                    tf.squeeze(tf.convert_to_tensor(bb_xyxy), axis=1))[0] # shape: (len(sorted_bb_info_list), )
        n = len(sorted_bb_info_list)
        sorted_bb_info_list = [
                    sorted_bb_info_list[i] for i in 
                    range(n) if iou[i] <= nms_threshold]
    return output
查看原文

赞 0 收藏 0 评论 0

Cloud 发布了文章 · 6月14日

使用Hexo的NexT主题

使用Hexo的NexT主题

介绍

image.png
NexT是Hexo的知名第三方主题,黑白极简风格四合一,有相当多的使用者,维护也相当给力,数年来一直都在频繁更新。但是最近搜索NexT, 却发现在之前的github仓库theme-next/hexo-theme-next之外,又出现一个新的仓库next-theme/hexo-theme-next,theme-next vs next-theme,难道是个李鬼?
但是查看作者竟然也是大神stevenjoezhang。stevenjoezhang是北大高材生,在theme-next 7.x版本前已经贡献了13万行代码,比项目的owner ivan-nginx多了10万行。
image.png
现在主要贡献者竟然另建了一个项目,从v8.0开始另起炉灶,似乎有点不比寻常。翻了翻大神的博客,竟然没有提到片语,查看项目的Issue讨论区,终于发现了端倪:
image.png
前排吃瓜走起...... 不管怎样,作为中国人,当然还是要追随大神脚步,使用新的repository。
八卦结束,安装和配置就比较简单了,配置之后我的博客长这个样子。
image.png
这里只记录了我用到的很少一部分功能,详细配置可以参考官方文档

安装

Clone NextT 到 themes文件夹下 

$ cd blog
$ git clone https://github.com/next-theme/hexo-theme-next themes/next

在hexo配置文件中修改themes为next

theme: next

配置

代码高亮

从v7..7.2开始NexT原生支持暗黑模式,代码高亮也可以针对light和dark模式分别设置。现在两个模式设置相同的高亮theme会报错,可能是个bug。

codeblock:
  # Code Highlight theme
  # See: https://github.com/highlightjs/highlight.js/tree/master/src/styles
  theme:
    light: tomorrow
    dark: tomorrow-night

百度统计

Next主题已经默认支持百度统计,直接在themes/next/_config.yml 中找到 baidu_analytics 填上app_id就可以了。

# Baidu Analytics
baidu_analytics: # <app_id>

这个app_id可以从百度统计给的安装代码中获取:注册登录https://tongji.baidu.com/,找到网站统计 -> 账户管理 -> 代码获取,在
image.png

评论系统

NexT现在支持六种评论系统 changyandisqusdisqusjsgitalkliverevaline。在当年多说关闭之后,其他国产的评论系统要么风雨飘摇,要么风评不加,这里还是坚持使用Disqus吧。在themes/next/_config.yml 中设置disqus enable。

# Multiple Comment System Support
comments:
  # Available values: tabs | buttons
  style: tabs
  # Choose a comment system to be displayed by default.
  # Available values: changyan | disqus | disqusjs | gitalk | livere | valine
  active: disqus
  # Setting `true` means remembering the comment system selected by the visitor.
  storage: true
  # Lazyload all comment systems.
  lazyload: false
  # Modify texts or order for any navs, here are some examples.
  nav:
    #disqus:
    #  text: Load Disqus
    #  order: -1
    #gitalk:
    #  order: -2
    
# Disqus
disqus:
  enable: true
  shortname: <your disqus shotname>
  count: false
  #post_meta_order: 0

侧边栏

自定义目录

在themes/next/_config.yml中打开categories,tags和archives目录

# ---------------------------------------------------------------
# Menu Settings
# ---------------------------------------------------------------

# Usage: `Key: /link/ || icon`
# Key is the name of menu item. If the translation for this item is available, the translated text will be loaded, otherwise the Key name will be used. Key is case-senstive.
# Value before `||` delimiter is the target link, value after `||` delimiter is the name of Font Awesome icon.
# When running the site in a subdirectory (e.g. yoursite.com/blog), remove the leading slash from link value (/archives -> archives).
# External url should start with http:// or https://
menu:
  home: / || fa fa-home
  #about: /about/ || fa fa-user
  tags: /tags/ || fa fa-tags
  categories: /categories/ || fa fa-th
  archives: /archives/ || fa fa-archive
  #schedule: /schedule/ || fa fa-calendar
  #sitemap: /sitemap.xml || fa fa-sitemap
  #commonweal: /404/ || fa fa-heartbeat

NexT主题只会自动生成home和archives目录,需要categories和tags目录的话需要手动添加:

  1. 使用hexo新建page
$ hexo new page tags
  1. 修改source/tags/index.md文件,添加一行 type: tags
title: Tags
date: 2014-12-22 12:39:04
type: tags
---

修改TOC配置

TOC 可以在点开文章后在侧边栏显示大纲,这里根据个人喜好,修改两项:

  • 展开所有子目录
  • Wrap 长标题到下一行
# Table of Contents in the Sidebar
# Front-matter variable (unsupport wrap expand_all).
toc:
  enable: true
  # Automatically add list number to toc.
  number: true
  # If true, all words will placed on next lines if header width longer then sidebar width.
  wrap: true
  # If true, all level of TOC in a post will be displayed, rather than the activated part of it.
  expand_all: true
  # Maximum heading depth of generated toc.
  max_depth: 6

打开back2top

back2top:
  enable: true
  # Back to top in sidebar.
  sidebar: true
  # Scroll percent label in b2t button.
  scrollpercent: true

会在侧边栏显示可以返回顶部的箭头和当前滚动的百分比。

image.png

查看原文

赞 0 收藏 0 评论 0

Cloud 关注了标签 · 6月11日

javascript

JavaScript 是一门弱类型的动态脚本语言,支持多种编程范式,包括面向对象和函数式编程,被广泛用于 Web 开发。

一般来说,完整的JavaScript包括以下几个部分:

  • ECMAScript,描述了该语言的语法和基本对象
  • 文档对象模型(DOM),描述处理网页内容的方法和接口
  • 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口

它的基本特点如下:

  • 是一种解释性脚本语言(代码不进行预编译)。
  • 主要用来向HTML页面添加交互行为。
  • 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

JavaScript常用来完成以下任务:

  • 嵌入动态文本于HTML页面
  • 对浏览器事件作出响应
  • 读写HTML元素
  • 在数据被提交到服务器之前验证数据
  • 检测访客的浏览器信息

《 Javascript 优点在整个语言中占多大比例?

关注 138926

Cloud 关注了标签 · 6月11日

vue.js

Reactive Components for Modern Web Interfaces.

Vue.js 是一个用于创建 web 交互界面的。其特点是

  • 简洁 HTML 模板 + JSON 数据,再创建一个 Vue 实例,就这么简单。
  • 数据驱动 自动追踪依赖的模板表达式和计算属性。
  • 组件化 用解耦、可复用的组件来构造界面。
  • 轻量 ~24kb min+gzip,无依赖。
  • 快速 精确有效的异步批量 DOM 更新。
  • 模块友好 通过 NPM 或 Bower 安装,无缝融入你的工作流。

官网:https://vuejs.org
GitHub:https://github.com/vuejs/vue

关注 100941

Cloud 关注了标签 · 6月11日

算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。

关注 13095

Cloud 关注了标签 · 6月11日

python

Python(发音:英[ˈpaɪθən],美[ˈpaɪθɑ:n]),是一种面向对象、直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句。

Python支持命令式程序设计、面向对象程序设计、函数式编程、面向切面编程、泛型编程多种编程范式。与Scheme、Ruby、Perl、Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理存储器使用。它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。Python虚拟机本身几乎可以在所有的作业系统中运行。使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。

Python的主要参考实现是CPython,它是一个由社区驱动的自由软件。目前由Python软件基金会管理。基于这种语言的相关技术正在飞快的发展,用户数量快速扩大,相关的资源非常多。

关注 103599

Cloud 关注了标签 · 6月11日

关注 86060

认证与成就

  • 获得 1 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 6月11日
个人主页被 220 人浏览