【HighChart教程】编程语言详细程度的互动比较

HighChart

下载Highcharts最新试用版

起点是评估他们在执行各种任务时的“简洁性”(而不是对任何语言的效率或效力做出任何判断)。

这引出了我Rosettacode.org,这是任何编程爱好者的一个很棒的信息来源。它提供了各种任务(超过870个)和代码片段来解决它们,在许多编程语言中(超过680个)。

探索Rosettacode.org并比较不同的编程语言。它可以帮助您找到解决您在“本土”语言中遇到的问题的新方法,并找出其他思维方式。为此,我写了一个小应用程序来促进这个过程,我将在这里与大家分享。

该应用程序,非常基本。它只是将Rosettacode.org的代码片段长度与不同的任务和语言进行比较,并使用我最喜欢的Javascript库Highcharts在条形图上显示结果。

Python,Flask,Highcharts和Azure环境

Azure是微软的云(免责声明,我为微软工作)。它是托管数据,创建机器人和自动执行任务,部署Python应用程序或利用AI的绝佳基础架构。
在本演示中,我在Azure上安装了一个python 3.4环境和一些库(Beautiful Soup和Flask)

第1步:Scraping

第一步是刮掉RosettaCode以获取所有可用任务。我写了一个非常简短的python脚本来进行抓取。我预先选择了一部分编程语言(见languages_dict下文),以避免刮掉太多不相关的数据。

# Selected language names and corresponding spelling/encoding as in HTML page 
languages_dict={"Java":"Java","JavaScript":"JavaScript","C":"C","C.2B.2B":"C++","C.23":"C#","COBOL":"Cobol","Haskell":"Haskell","Python":"Python","R":"R","Julia":"Julia","MATLAB_.2F_Octave":"Matlab","Pascal":"Pascal","Fortran":"Fortran","BASIC":"BASIC","Go":"Go","Ruby":"Ruby","SAS":"SAS","Stata":"Stata","Swift":"Swift","Processing":"Processing","UNIX_Shell":"UNIX Shell","VBA":"VBA","PowerShell":"PowerShell"}

#store language names in an array
language_name=[]

#populate the array from the dict
for item in languages_dict:language_name.append(languages_dict[item])

#get all tasks from Rosettacode.org
url_task="http://www.rosettacode.org/wiki/Category:Programming_Tasks"
r = requests.get(url_task)
soup = BeautifulSoup(r.text, 'html.parser')
table=soup.find("div", {"class": "mw-category"})

#Create an empty dictionary to be filled with the tasks as they appear in the HTML source and name (as header)
url_dict={}

#get all links (a tags) 
tags=table('a')

#iterate over tag list and fill the task/url dictionary
for tag in tags:
    url_dict[tag.get('title',None)]=tag.get('href',None)[6:]

#store task names in an array
task_name=[]
for item in url_dict: task_name.append(item)
array_language=[]
count=[]
task=""

#flask method to get the task the user wants to compare
if request.method == "POST":
    # get url from task the user requested
    task = request.form['task']
    url="https://www.rosettacode.org/wiki/"+url_dict[task]
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    dict_count={}
    for language in languages_dict:
        try: 
            header=soup.find("span", {"id": language})
            snippet=BeautifulSoup(header.find_next("pre").text, 'html.parser')
            dict_count[languages_dict[language]] = len(snippet.text)
        except: 
            continue

    #sort dictionary
    for lang in sorted(dict_count, key=dict_count.get, reverse=True):
        array_language.append(lang)
        count.append(dict_count[lang])

当用户选择要比较的任务时,上面的脚本查找预先选择的语言并评估相应片段的长度(在HTML中相应的标题之后的“pre”标签内)。该脚本将结果存储在一个数组中,该数组将通过Flask发送到前端到我的Highcharts。

以下是与“ For循环 ” 对应的片段的结果数组:

# array_language
['C', 'Swift', 'Pascal', 'Go', 'BASIC', 'Haskell', 'UNIX Shell', 'Matlab', 'Processing', 'PowerShell', 'Fortran', 'Cobol', 'VBA', 'C++', 'Java', 'Julia', 'Ruby', 'JavaScript', 'Python', 'R', 'SAS', 'Stata', 'C#']

#count (length of the snippets)
[90, 73, 144, 167, 70, 115, 400, 103, 103, 116, 1211, 533, 193, 104, 119, 71, 55, 114, 92, 85, 293, 79, 261]

然后这些数组将提供条形图。

第2步:Highcharts

Python和Flask使用和将数据数组发送到Highcharts 。在HTML页面呈现期间,服务器注入使用python构造的数组。请注意,我使用该选项来避免任何编码意外。{{ array_language | safe}}{{count}}| safe

Highcharts.chart('container', {
    chart: {
        type: 'bar'
    },
    title: {
        text: 'Programming language comparison: {{task | safe}} '
    },
    subtitle: {
        text: 'Source: rosettacode.org'
    },
    xAxis: {
        categories: {{ array_language   | safe}},
        title: {
            text: null
        }
    },
    yAxis: {
        min: 0,
        title: {
            text: 'Task size (char)',
            align: 'high'
        },
        labels: {
            overflow: 'justify'
        }
    },
    tooltip: {
        valueSuffix: 'chars'
    },
    plotOptions: {
        bar: {
            dataLabels: {
                enabled: true
            }
        }
    },

    series: [{
        name: '{{task}}',
        data: {{count}}
    }]
});

结果

  • 下面是该应用程序的屏幕截图。
  • 以下是Azure上托管的Python脚本和HTML页面。

HighChart

我们现在有一种交互方式来比较执行许多任务所需的代码长度!要添加到图表中的一个很好的功能是将代码段显示为每种语言的工具提示。这将增强我们对Rosettacode的视觉探索。

猜你喜欢

转载自blog.csdn.net/xiaochuachua/article/details/86636864