python对比c语言_通过实例浅析Python对比C语言的编程思想差异

article/2025/4/20 23:49:34

我一直使用 Python,用它处理各种数据科学项目。 Python 以易用闻名。有编码经验者学习数天就能上手(或有效使用它)。

听起来很不错,不过,如果你既用 Python,同时也是用其他语言,比如说 C 的话,或许会存在一些问题。

给你举个我自己经历的例子吧。 我精通命令式语言,如 C 和 C++。对古老经典的语言如 Lisp 和 Prolog 能熟练使用。另外,我也用过 Java,Javascript 和 PHP 一段时间。(那么,学习) Python 对我来讲不是很简单吗?事实上,只是看起来容易,我给自己挖了个坑:我像用 C 一样去用 Python。

具体情况,请向下看。

一个最近的项目中,需要处理地理空间数据。给出(任务)是 gps 追踪 25,000 个左右位置点,需要根据给定的经纬度,重复定位距离最短的点。我第一反应是,翻查(已经实现的)计算已知经纬度两点间距离的代码片段。代码可以在 John D. Cook 写的这篇 code available in the public domain 中找得到。

万事俱备! 只要写一段 Python 函数,返回与输入坐标距离最短的点索引(25,000 点数组中的索引),就万事大吉了:

def closest_distance(lat,lon,trkpts):

d = 100000.0

best = -1

r = trkpts.index

for i in r:

lati = trkpts.ix[i,'Lat']

loni = trkpts.ix[i,'Lon']

md = distance_on_unit_sphere(lat, lon, lati, loni)

if d > md

best = i

d = md

return best

其中, distance_on_unit_sphere 是 John D. Cook's 书中的函数,trkpts 是数组,包含 gps 追踪的点坐标(实际上,是 pandas 中的数据帧,注,pandas 是 python 第三方数据分析扩展包)。

上述函数与我以前用 C 实现的函数基本相同。 它遍历(迭代)trkpts 数组,将迄今为止(距离给定坐标位置)的距离最短的点索引值,保存到本地变量 best 中。

目前为止,情况还不错,虽然 Python 语法与 C 有很多差别,但写这段代码,并没有花去我太多时间。

代码写起来快,但执行起来却很慢。例如,我指定428 个点,命名为waypoints(导航点,路点,导航路线中的关键点)。导航时,我要为每个导航点 waypoint 找出距离最短的点。为 428 个导航点 waypoint 查找距离最短点的程序,在我的笔记本上运行了 3 分 6 秒。

之后,我改为查询计算曼哈坦距离,这是近似值。我不再计算两点间的精确距离,而是计算东西轴距离和南北轴距离。计算曼哈坦距离的函数如下:

def manhattan_distance(lat1, lon1, lat2, lon2):

lat = (lat1+lat2)/2.0

return abs(lat1-lat2)+abs(math.cos(math.radians(lat))*(lon1-lon2))

实际上,我用了一个更简化的函数,忽略一个因素,即维度曲线上 1 度差距比经度曲线上的 1 度差距要大得多。简化函数如下:

def manhattan_distance1(lat1, lon1, lat2, lon2):

return abs(lat1-lat2)+abs(lon1-lon2)

closest 函数修改为:

def closest_manhattan_distance1(lat,lon,trkpts):

d = 100000.0

best = -1

r = trkpts.index

for i in r:

lati = trkpts.ix[i,'Lat']

loni = trkpts.ix[i,'Lon']

md = manhattan_distance1(lat, lon, lati, loni)

if d > md

best = i

d = md

return best

如果将 Manhattan_distance 函数体换进来,速度还可以快些:

def closest_manhattan_distance2(lat,lon,trkpts):

d = 100000.0

best = -1

r = trkpts.index

for i in r:

lati = trkpts.ix[i,'Lat']

loni = trkpts.ix[i,'Lon']

md = abs(lat-lati)+abs(lon-loni)

if d > md

best = i

d = md

return best

在计算的最短距离点上,用这个函数与用 John's 的函数效果相同。我希望我的直觉是对的。越简单就越快。现在这个程序用了 2 分 37 秒。提速了 18%。 很好,但还不够激动人心。

我决定正确使用 Python。这意味着要利用 pandas 支持的数组运算。这些数组运算操作源于 numpy 包。通过调用这些数组操作,代码实现更简练:

def closest(lat,lon,trkpts):

cl = numpy.abs(trkpts.Lat - lat) + numpy.abs(trkpts.Lon - lon)

return cl.idxmin()

该函数与之前函数的返回结果相同。在我的笔记本上运行时间花费了 0.5 秒。整整快了 300 倍! 300 倍,,也即30,000 %。不可思议。 提速的原因是 numpy 数组操作运算用 C 实现。因此, 我们将最好的两面结合起来了: 我们得到 C 的速度和 Python 的简洁性。

教训很明确:别用 C 的方式写 Python 代码。用 numpy 数组运算,不要用数组遍历。对我来说,这是思维上的转变。

Update on July 2, 2015。文章讨论在Hacker News。一些评论没有注意到(missed )我用到了 pandas 数据帧的情况。主要是它在数据分析中很常用。如果我只是要快速的查询最短距离点,且我时间充分,我可以使用 C 或 C++ 编写四叉树(实现)。

Second update on July 2, 2015。有个评论提到 numba 也能对代码提速。我就试了一下。

这是我的做法,与你的情况不一定相同。 首先,要说明的是,不同的 python 安装版,实验的结果不一定相同。我的实验环境是 windows 系统上安装 Anaconda,同时也安装了一些扩展包。可能这些包和 numba 存在干扰。.

首先,输入下面的安装命令,安装 numba:

$ conda install numba

这是我命令行界面上的反馈:

2015830181326478.jpg?2015730181335

之后我发现,numba 在 anaconda 安装套件中已存在。 也可能安装指令有变更也说不定。

推荐的 numba 用法:

@jit

def closest_func(lat,lon,trkpts,func):

d = 100000.0

best = -1

r = trkpts.index

for i in r:

lati = trkpts.ix[i,'Lat']

loni = trkpts.ix[i,'Lon']

md = abs(lat - lati) + abs(lon - loni)

if d > md:

#print d, dlat, dlon, lati, loni

best = i

d = md

return best

我没有发现运行时间提高。我也尝试了更积极的编译参数设置:

@jit(nopython=True)

def closest_func(lat,lon,trkpts,func):

d = 100000.0

best = -1

r = trkpts.index

for i in r:

lati = trkpts.ix[i,'Lat']

loni = trkpts.ix[i,'Lon']

md = abs(lat - lati) + abs(lon - loni)

if d > md:

#print d, dlat, dlon, lati, loni

best = i

d = md

return best

这次运行代码时,出现一个错误:

2015830181215738.jpg?2015730181226

看来,pandas 比 numba 处理代码更智能。

当然,我也能花时间修改数据结构,使 numba 能正确编译(compile)。可是,我为什么要这么干呢? 用 numpy 写的代码运行的足够快了。反正,我一直在用 numpy 和 pandas 。为什么不继续用呢?

也有建议我用pypy。这当然有意义,不过…我用的是托管服务器上的 Jupyter notebooks(注,在线浏览器的 python 交互式开发环境)。我用的是它提供的 python 内核,也即,官方的(regular)Python 2.7.x 内核。并没有提供 Pypy 选择。

也有建议用 Cython。好吧,如果我回头要编译代码 ,那我干脆直接用 C 和 C++ 就好了。我用 python,是因为,它提供了基于 notebooks(注:网页版在线开发环境)的交互式特性,可以快速原型实现。这却不是 Cython 的设计目标。

本文标题: 通过实例浅析Python对比C语言的编程思想差异

本文地址: http://www.cppcns.com/jiaoben/python/130395.html


http://chatgpt.dhexx.cn/article/WkWXYRWo.shtml

相关文章

中科数创 php,PHP生成验证码 - 低调是最牛逼的炫耀 - OSCHINA - 中文开源技术交流社区...

PHP提供了一系列函数来实现在网站编程中对图像进行编辑。PHP的图像处理函数都封装在一个函数库中,这就是GD库。GD库用于处理图像,它是一个开放源码的动态创建图像的函数库,可以创建和操作多种不同格式的图像文件,并可以直接以图像…

1+X Web前端等级考证 | PHP 技术与应用(中级重点)

文章目录 动态网站动态网站开发所需构件PHP技术基础php 的诞生php 的优点php 的缺点 开发环境php 语言基础文件命名语言标记注释符与结束符常用命令和系统函数变量与常量常量变量变量与常量的差异 数据类型数据类型转换字符串数组数组转JSON 运算符流程控制流程分支 循环结构wh…

在直播卖货系统中,分销和代销是什么意思?

就在前几天,艾瑞咨询发布了《2020年中国直播电商生态研究报告》,报告中指出,19年至今,直播电商整体成交额达4512.9亿元,同比增长200.4%,占网购整体规模的4.5%,成长空间较大,预计未来…

社交零售多商户分销商城APP小程序系统

多种业务场景模式 自由灵活切换 新零售时代主流多用户商城,满足多种用户形态多样业务场景,解决线上的引流,推广难题! 自营模式 1.平台建立自营线上商城,整合自身多渠道业务,通过会员、商品、订单、财务等…

微信小程序、APP分销商城开发:分销功能模块设计

前面我们讲了微信小程序商城基础营销功能:微信小程序商城、APP商城开发营销活动功能策划(拼团、砍价、秒杀、直播、优惠券等) 今天讲的分销系统更是强大的营销功能,它应该如何设计呢?我们的系统经过一点一点更改更新&…

人人商城源码怎么安装MySQL_人人商城12个常见错误解决方案

人人商城12个常见错误解决方案 微信小程序报错request:fail url not in domain list 有两个原因第一个是报错提示说请求的url不在域名列表里,应该是还没有配置服务器域名,可点击开发者工具右上角 详情-域名信息,看看是否配置了域名&#xff1…

三级分销商城  避坑避雷指南

三级分销自出现以来就引发社会各界的关注,这种病毒式的传播方式产生的盈利效果,让许多商家都蠢蠢欲动,相比于这种模式的风险性,如何去赚钱才是商家最关心的事情,基于三级分销模式研发的三级分销商城也成为企业发展线上…

小程序分销平台商城开发系统

小程序分销平台商城开发系统找何经理。小程序分销商城、小程序分销系统平台等。从更广阔的视角来说,目前移动互联正在给我们的世界带来新的沟通、学习、工作、生活方式,并将引领未来的潮流。不再是单纯的电子渠道建设、业务线上迁移与技术改造升级,而是一场使企业产品创新、…

三级分销系统哪家好

众所周知,如今许多年轻人都纷纷挤进创业这个行列,使得各行各业的商业市场竞争日趋激烈。在这个问题面前,企业如何最大程度的做好营销推广,使销售业绩达到最高值呢?当然,我们不得不承认互联网是最有效果的渠…

PHP商城源码分销奖励/绑定关系设计

来客推PHP分销商城源码是通过互联网将供应商与经销商有机地联系在一起,打造多层级的分销成交平台。 通过分享、邀请等方式绑定上下级关系,把会员和消费者变成分销商,让分销商宣传售卖商品。 分销商获得佣金和奖励,而供货商得到低成…

CRMEB v3.1分销设计思路

1、CRMEB分销模式有几种,有什么区别? 两种分销模式,指定分销和人人分销;指定分销:用户默认无分销权限,需要后台开通分销权限后,才可以推广下级获得返佣;人人分销:用户默…

人人商城小程序消息服务器配置,微擎系统人人商城小程序前端配置教程

人人商城是目前微信商城系统里面用的最多的程序,它功能强大,支持多商户入驻、分销功能、拼团活动、秒杀活动、直播购物功能等。现在更是支持了微信小程序功能,那么人人小程序是如何安装的呢。 首先你得准备认证服务号、服务器、备案域名。人人…

直播教育平台源码中的人人分销是什么?如何实现?

根据艾瑞咨询发布的《2020年H1中国教育行业广告主营销策略研究报告》显示,近段时间,在线教育的市场投放成本节节高升。对于刚刚崛起的在线教育来说,如何低成本获客就成为了一个非常重要的问题。其中,在直播教育平台源码中加入人人…

免费分销工具—运营指南分销系统

免费分销工具—运营指南分销系统 疫情之下,无人出门到陆续复工,餐饮、教培、旅游等实体行业行业到店消费人数并未猛然上涨,所谓的“报复性消费”仍未到来,实体行业店面收入远远低于成本,经营极度困难。 在这种困境下,如何增加订单,获取更多顾客,实现逆势增长? 01 …

公排系统php,全球公排自动滑落二二复制多级分销系统PHP二二复制多级分销源码...

菜鸟源码网分享全球公排自动滑落二二复制多级分销系统PHP二二复制多级分销源码,站长测试源码安装和后台登陆功能设置保存正常,用户端注册登录购买商品正常,商户端登陆添加商品等正常。PHP全球公排自动滑落 二二复制 九九复制带加权分红系统&a…

火遍全网的全民分销系统,你了解多少?

随着互联网的发展,用户流量也逐渐壮大,对于企业来说,平台发展需要流量,怎么样获取流量一个重点问题,随着电商的深入发展,人们探索出各种更深层次挖掘流量的办法,全民分销系统就是其中一种&#…

公排系统php,全球公排自动滑落二二复制多级分销系统 PHP源码

详细制度讲解 1、分销与公排并行1-9级自定义设置分销层级 2-9级自定义递增排位公排:二二复制、三三复制………九九复制 2、威 信分销的状态可以开启或关闭,由您说了算(关闭分销后将不再启用分销和公排) 公排的状态可以开启或关闭(…

php商城开发人人分销团队级差分红升级规则订制

注:所有内容可定制开发,可单独模块更新,联系QQ:1002424826,微信:php510666 使用须知 1.如果您已经在使用本系统,即表示您已经同意以下免责声明条款,否则请立即停止使用本系统。 2.使用方在使用…

线上连锁线下整合的连锁电商架构 打造店店互推人人分销模式

传统的连锁店需要上线电商平台,这是一个十分困难的事情,因为原来的门店会觉得上线的电商会损害原来的利益,加上不少门店没有任何线上运营的基础,对线上网店十分排斥。核货宝小编认为,如何将线下连锁与线上业务打通&…

CRMEB 单商户系统,配置人人分销之后,在分销员管理列表中不显示推广员

开源链接:点击获取开源代码 CRMEB 单商户系统,配置人人分销之后,在分销员管理列表中不显示推广员的问题。 修复办法: 在app/services/user/UserService.php中修改下方代码,将红色代码改为绿色代码 getAgentUserList…