python算法

使用Python实现一个简单的LRUCache

試著忘記壹切 提交于 2020-01-05 00:43:38
简介 我们都知道,Redis会使用“淘汰策略”来进行热点数据的管理,其中大部分场景下都会使用LRU(Least Recently used)算法,本文从一个简单的使用dict缓存斐波那契数列的值为例引出LRU的使用场景并使用Python实现一个简单的LRUCache。 使用缓存减少计算或者主数据库的开销 在实际的业务场景中,我们常常会使用缓存来减少程序的计算或者用户频繁访问主数据库的开销。比如说,我这里有一个接口函数fib,用户使用某一个天数来请求数据时,接口将计算结果返回给用户: def fib(n): if n <= 2: return 1 return fib(n-1) + fib(n-2) 为了减少程序计算的开销,我们可以使用一个字典去“缓存”对应的结果,也就是说, 我们可以提前计算好用户请求的天数与对应结果的对应信息,如果用户请求的天数在“缓存”中的话我们可以直接将缓存中的结果返回给用户,这样就有效的减少了一次程序的开销! 装饰器方式实现“缓存效果” # 字典中有的会从这里取值而不用计算,减少计算开销 dic = {1:1,2:1,3:2} def wrapper(func): global dic def inner(n): if n in dic: return dic[n] res = func(n) dic[n] = res return res return

python 机器学习实践入门

走远了吗. 提交于 2020-01-04 08:43:02
机器学习概念概念 机器 学习是计算机科学的一个分支,从模式识别、人工智能和计算学习理论发展而来,我们可以将其作为数据挖掘的工具 侧重用于数据分析方法理解给定的数据 目的是:开发能够从先前观测的数据,通过可调整的参数进行学习的 程序,为了改善预测结果,将参数设计为可自动调整的 常见应用:垃圾邮件过滤器、搜索引擎,光学字符识别(OCR)和计算机视觉 任何一个问题都始于一个数据集,未知数据的特征根据数据集来预测;为了解决问题选用的机器学习算法用数学模型来描述,模型 包含一些参数,需要在训练集上调试。训练完成后,模型的预测性能用另外两个数据集来评估:验证集和训练集 无监督学习 有监督学习 1.2 数据的准备、处理和可视化--NumPy、pandas和maplotlib教程 第2章、无监督学习 第3章、有监督学习 通常指分类和回归 本章讲解,线性回归、朴素贝叶斯、决策树和支持向量机算法 第4章web数据挖掘 搜索引擎,拿到查询词(search query)之后,分析每个网页的数据,找到查询相关的网页。网页中的数据通常分为网页内容和链接到其他网页的超链接 引擎的组成部分: 用自然语言处理技术深入分析其中的内容,比如使用潜在狄利克雷分布分析、意见挖掘或情感分析工具。 这些重要技术适用于从web内容抽取其发表人的主观看法 第5章 推荐系统 是电子商务平台的重要部件,推荐系统的典型应有于Amazon

Python性能提升小技巧

独自空忆成欢 提交于 2020-01-04 03:42:33
第一部分 1-使用内建函数: 你可以用Python写出高效的代码,但很难击败内建函数. 经查证. 他们非常快速 2-使用 join() 连接字符串. 你可以使用 + 来连接字符串. 但由于string在Python中是不可变的,每一个 + 操作都会创建一个新的字符串并复制旧内容. 常见用法是使用Python的数组模块单个的修改字符;当完成的时候,使用 join() 函数创建最终字符串. >>> #This is good to glue a large number of strings >>> for chunk in input(): >>> my_string.join(chunk) 3-使用Python多重赋值,交换变量 这在Python中即优雅又快速: >>> x, y = y, x 这样很慢: >>> temp = x >>> x = y >>> y = temp 4-尽量使用局部变量 Python 检索局部变量比检索全局变量快. 这意味着,避免 "global" 关键字. 5-尽量使用 in 使用 in 关键字. 简洁而快速. >>> for key in sequence: >>> print “found” 6-使用延迟加载加速 將 import 声明移入函数中,仅在需要的时候导入. 换句话说,如果某些模块不需马上使用,稍后导入他们. 例如

[LeetCode]题解(python):004-Median of Two Sorted Arrays

青春壹個敷衍的年華 提交于 2020-01-04 01:21:04
题目来源: https://leetcode.com/problems/median-of-two-sorted-arrays/ 题意分析: 这道题目是输入两个已经排好序的数组(长度为m,n),将这两个数组整合成一个数组,输出新数组的中位数。要求时间复杂度是(log(m + n)。比如如果输入[1,2,3],[3,4,5]。那么得到的新数组为[1,2,3,3,4,5]得到的中位数就是3. 题目思路: 由于题目要求的时间复杂度是(log(m+n)),如果我们直接把两个数组整合一起,那么时间复杂度肯定超过(log(m+n))。所以整理肯定是不行的。那么还有什么方法吗?答案是肯定的。 首先我们要先了解中位数的概念,中位数就是有序数组的中间那个数。那么如果我们将比中位数小的数和比中位数大的数去掉同样的个数,中位数的值也不会变化 (数组的个数为偶数的时候另外讨论,因为那时候中位数是中间两个数的平均值,所以中位数旁边两个数不能去掉) 。 所以我们不妨试着将数组长度不断缩短。这里不妨提出一个引理。假设有两个有序数组a m ,b n ,他们整合后的有序数组为c n+m 。他们的中位数分别是a m /2 ,b n /2 ,c (m+n)/2 。如果a m /2 < b n /2 ,则 a 0 …m/2 <= c (m+n)/2 <= b n /2…n 。 引理证明: 假设 a m/2 > c (m

Python面向对象编程的三大特性

為{幸葍}努か 提交于 2020-01-03 19:26:02
面向对象编程的三大特性 面向对象的三大特性是指:封装、继承和多态 01对象和类 类(Class) 是现实或思维世界中的实体在计算机中的反映,它将数据以及这些 数据上的操作封装在一起。 对象(Object) 是具有类类型的变量。类和对象是面向对象编程技术中的最基本 的概念。 如何定义类? class 类(): pass 如何将类转换成对象? 实例化 是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概 念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = 类名(参数1,参数2…参数n)构成 类(Class) 是是创建实例的模板 对象(Object) 是一个一个具体的实例 # class 类名称: 定义类的方式 class Person : # 占位关键字, 什么也不做 pass print ( Person ) # <class '__main__.Person'> 存储于当前脚本的Person类 # 对象:将类实例化/具体化产生的值 personObj = Person ( ) # <__main__.Person object at 0x7f28164b04d0> # 当前脚本的Person类实例化出来的对象存储的内存地址是0x7f28164b04d0 print ( personObj ) Python中自带的类有: from datetime

排序算法学习,python实现

不打扰是莪最后的温柔 提交于 2020-01-03 05:17:41
原创博文,转载请注明 出处 利用周六周末的时间把几种基本的排序方法用python实现了一下,废话少说,直接上代码。 本文不注重基础知识的讲解,只做大致的描述,大家如果不清楚概念,自行查找资料。 直接插入排序:    每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。 1 def insert(arr): 2 l = len(arr) 3 for i in range(1,l): 4 if arr[i]<arr[i-1]: 5 temp =arr[i] 6 j=i-1 7 arr[j+1]=arr[j] 8 j=j-1 9 while j>=0 and arr[j]>temp: 10 arr[j+1]=arr[j] #元素后移 11 j=j-1 12 arr[j+1]=temp 13 return arr 14 arra=[98,36,-9,0,47,23,1,8,10,7] 15 print insert(arra) 折半插入排序:   折半插入排序就是就是将上面直接插入排序中查找有序子表的工作使用折半查找来实现,在确定出待插入位置后,就可以统一的向后移动元素。 1 # -*- coding: cp936 -*- 2 def find_ff(arr,x):#折半查找 3 size =len(arr) 4 low = 0 5 high = size-1 6

Python 实现排序算法

自古美人都是妖i 提交于 2020-01-03 05:05:23
排序算法 下面算法均是使用Python实现: 插入排序 原理:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或quicksort。时间复杂度为 O(n^2) 。 # 1nd: 两两交换def insertion_sort(seq): for i in range(1, len(seq)): j = i while j >= 0 and seq[j-1] > seq[j]: seq[j], seq[j-1] = seq[j-1], seq[j] j -= 1 return seq​​# 2nd: 交换,最后处理没交换的def insertion_sort2(seq): for i in range(1, len(seq)): j = i-1 key = seq[i] while j >= 0 and seq[j] > key: seq[j+1] = seq[j] j -= 1 seq[j+1] = key return seq​​# 3nd: 加速版本,利用已经排好了序的进行二分查找def insertion_sort3(seq): for i in range(1, len(seq)): key =

python 之常用模块

戏子无情 提交于 2020-01-02 22:45:48
模块(module): 模块实质是一个python文件,也就是把python代码写到模块里面。 模块分类: 标准库:python内置 开源模块:第三方 自定义模块:自己写 一、os , sys 模块 import os, sys print(os.getcwd()) #获取当前目录 os.chmod("/usr/share", 7) #给/usr/share目录添加权限 print(os.curdir) #当前目录 print(os.pardir) #父目录 print(os.makedirs("/usr/local/mysql")) #递归创建目录,父目录不存在时创建目录 print(os.removedirs("/usr/local/mysql")) #递归删除空目录 print(os.mkdir("new")) #创建文件夹 os.rename("old", "new") #重命名 print(os.path.join("/root",'mysql','rack.sql')) #拼接成一个路径 print(os.path.split("/usr/mysql/123.txt")) #分割路径和文件名 print(os.sep) #当前操作系统的路径分隔符 print(os.linesep) #当前操作系统的换行符 print(os.pathsep)

机器学习:Python实现聚类算法(三)之总结

核能气质少年 提交于 2020-01-02 18:21:57
考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作用,而重点是放在如何使用及使用的场景。 (题外话: 今天看到一篇博文: 刚接触机器学习这一个月我都做了什么? 里面对机器学习阶段的划分很不错,就目前而言我们只要做到前两阶段即可) 因为前两篇博客已经介绍了两种算法,所以这里的算法编号从3开始。 3.Mean-shift 1)概述 Mean-shift(即:均值迁移)的基本思想:在数据集中选定一个点,然后以这个点为圆心,r为半径,画一个圆(二维下是圆),求出这个点到所有点的向量的平均值,而圆心与向量均值的和为新的圆心,然后迭代此过程,直到满足一点的条件结束。(Fukunage在1975年提出) 后来Yizong Cheng 在此基础上加入了 核函数 和 权重系数 ,使得Mean-shift 算法开始流行起来。目前它在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。 2)图解过程 为了方便大家理解,借用下几张图来说明Mean-shift的基本过程。 由上图可以很容易看到,Mean-shift 算法的核心思想就是不断的寻找新的圆心坐标,直到密度最大的区域。 3)Mean-shift 算法函数 a)核心函数:sklearn.cluster

Python学习笔记 capture 1

空扰寡人 提交于 2020-01-02 18:14:55
  最近开始学习Python3.x,真的感觉Python的语法与C++,Java有很大的不同,Python从某些方面来说语法更简单。Python作为一种解释性语言和编译型语言如C++来说,还是各有千秋的。不过本质来说,编译型语言,是一次编译,生成一个电脑可识别的机器码,到处运行,而解释型语言是解释一行,运行一行,或许从这方面来说,Python的运行时间要久于C++,但相对于人眼感知的时间来说,可忽略。事无绝对。Python作为一种高级编程语言,正在世界范围内变得越来越流行。 目前Python主要应用领域: 云计算 : 云计算最火的语言, 典型应用OpenStack WEB开发 : 众多优秀的WEB框架,众多大型网站均为Python开发,Youtube, Dropbox, 豆瓣。。。, 典型WEB框架有Django 科学运算、人工智能 : 典型库NumPy, SciPy, Matplotlib, Enthought librarys,pandas 系统运维 : 运维人员必备语言 金融 :量化交易,金融分析,在金融工程领域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作为动态语言的Python,语言结构清晰简单,库丰富,成熟稳定,科学计算和统计分析都很牛逼,生产效率远远高于c,c++,java,尤其擅长策略回测 图形GUI : PyQT, WxPython