2020年3月29日 星期日

[解決方法]引入cv2時發生ImportError: libSM.so.6: cannot open shared object file: No such file or directory錯誤

使用Docker並在Python程式import cv2時可能會傳回
ImportError: libSM.so.6: cannot open shared object file: No such file or directory
的錯誤。

這是因為dockerfile的基本映像檔已經過期了

解決方法:
首先,開啟CLI介面,更新apt-get,輸入:
sudo apt-get update

然後,安裝libsm6,libxext6,libxrender-dev這三個元件,輸入:
sudo apt-get install -y libsm6 libxext6 libxrender-dev


更新完後,再重新import一次cv2,問題得以解決


=====分隔線=====
如果覺得這篇文有幫助到你們的話,請留言或幫忙按個廣告吧。

您的支持是我寫文的最大動力。

如果依然失敗了,也請留言讓我知道,看看哪個環節出了問題,我有看到就會回。


希望這篇文有幫助到各位ξ( ✿>◡❛)

2020年3月6日 星期五

[不專業評比]各主流程式語言效能比較

本篇將依據各主流程式語言執行的時間來比較效能差異

程式語言的速度僅供參考,效能往往取決於譯器而非語言本身


系統環境:

  • 作業系統:Windows10,64位元
  • CPU:intel i7 9700
執行環境:
  • Java:cmd
  • JavaScript:Chrome
  • C++:Visual Studio 2019
  • C#:Visual Studio 2019
  • Python:Spider
================
比較:各語言的IO效能

程式碼:
JAVA
  • for (var i=0;i<10000;i++)System.out.print(1);  
JavaScript
  • for (var i=0;i<10000;i++)console.log(1);
C++
  • for(int i=0;i<10000;i++) std::cout << 1;
C#
  • for (int i = 0; i < 10000; i++) Console.Write(1);
Python
  • for i in range(10000):
  •     print(1)

執行時間(單位:毫秒)

Java130
JavaScript73
C++176
C++(最佳化)129
C#136
C#(最佳化)132
Python142

=================
比較:各語言的一維陣列/串列填充效能

程式碼
JAVA
  • for (var i=0;i<1000000;i++)arr[i]=i; 
JavaScript
  • for (var i=0;i<1000000;i++)arr[i]=i;
C++
  • for (int i = 0; i < 1000000; i++)
  • number[i]=i;
C#
  • for (int i = 0; i < 1000000; i++) number[i]=i;
Python
  • for i in range(1000000):
  •     list0[i]=i


執行時間(單位:毫秒)

Java2
JavaScript6
C++2
C++(最佳化)2
C#4
C#(最佳化)2
Python98

=============================
比較:各語言的串列新增效能

程式碼
JAVA
  • for (int i = 0; i < 1000000; i++) st.push(i); 
JavaScript
  •  for (var i=0;i<10000000;i++)list.push(i);
C++
  • for (int i = 0; i < 1000000; i++)
  • mystack.push(i);
C#
  • for (int i = 0; i < 1000000; i++) myStack.Push(i); 
Python
  • for i in range(1000000):
  •     list0.append(i)

執行時間(單位:毫秒)

Java20
JavaScript135
C++690
C++(最佳化)12
C#59
C#(最佳化)59
Python94

========================
比較:各語言的遞迴效能(使用費氏數列)

程式碼
JAVA
  • public static long fib(int n){
  •         if(n==1)
  • return 1;
  • else if (n==2)
  • return 1;
  • else
  • return fib(n-1)+fib(n-2); 
  •     }   
  • fib(40);
JavaScript
  • function fib(n){
  •       if (n == 1)
  •         return 1;
  •       else if (n == 2)
  •         return 1;
  •       else
  •         return fib(n - 1) + fib(n - 2);
  •     }
  • fib(40);
C++
  • static long fib(int n) {
  • if (n == 1)
  • return 1;
  • else if (n == 2)
  • return 1;
  • else
  • return fib(n - 1) + fib(n - 2);
  • }
  • std::cout<<fib(40);
C#
  • static long fib(int n)
  •         {
  •             if (n == 1)
  •                 return 1;
  •             else if (n == 2)
  •                 return 1;
  •             else
  •                 return fib(n - 1) + fib(n - 2);
  •         }
  • fib(40);
Python
  • def fib(n):
  •     if n == 1:
  •         return 1
  •     elif n == 2:
  •         return 1
  •     else:
  •         return fib(n - 1) + fib(n - 2); 
  • fib(40)

執行時間(單位:毫秒)

Java224
JavaScript632
C++2527
C++(最佳化)251
C#2035
C#(最佳化)343
Python17947

================
比較:各語言大型二維陣列效能

程式碼(灰色字不列入計時):
JAVA

  • int arr[][]; 
  •  arr = new int[10000][10000]; 
  • for(int i = 0; i < arr.length; i++)  
  •             for(int j = 0; j < arr[i].length; j++) 
  •                 arr[i][j] = 0; 
  • for(int i = 0; i < arr.length; i++)  
  •             for(int j = 0; j < arr[i].length; j++) 
  •                 arr[i][j] = 255-arr[i][j]; 
JavaScript
  • var tArray = new Array();
  •     for (var k = 0; k < 10000; k++) {
  •       tArray[k] = new Array();
  •       for (var j = 0; j < 10000; j++) {
  •         tArray[k][j] = 0;
  •       }
  •     }
  •     var y=0,x=0;
  •  for (y = 0; y < 10000; y++) {
  •       for (x = 0; x < 10000; x++) {
  •         tArray[y][x] = 255 - tArray[y][x];
  •       }
  •     }
C++
  • unsigned char** fp = new unsigned char* [10000];
  • int x = 0, y = 0;
  • for (int j = 0; j < 10000; j++)
  • fp[j] = new unsigned char [10000];
  • for (y = 0; y < 10000; y++)
  • {
  • for (x = 0; x < 10000; x ++)
  • {
  • fp[y][x] = 255 - fp[y][x];
  • }
  • }

C#
  • int[,] number = new int[10000, 10000];
  •             int y = 0, x = 0;
  •             for (y = 0; y < 10000; y++) for (x = 0; x < 10000; x++) number[y,x] = 0;
  • for (y = 0; y < 10000; y++)
  • {
  • for (x = 0; x < 10000; x++)
  • {
  •  number[y,x] = 255 - number[y,x];
  • }
  •  }
Python
  • score=[[0]*10000 for i in range(10000)]
  • for i in range(10000):
  •     for j in range(10000):
  •         score[i][j]=0
  • for i in range(10000):
  •     for j in range(10000):
  •         score[i][j]=255-score[i][j]

執行時間(單位:毫秒)

Java52
JavaScript194
C++185
C++(最佳化)45
C#437
C#(最佳化)171
Python13908

=======================
整體上來說,在各個方面每個語言各有優劣

但依我個人排序的順序比為:
  1. C++(最佳化)
  2. Java
  3. C#(最佳化)
  4. JavaScript
  5. Python
不過就如開頭紅字所說,程式語言不應用來直接比較速度,如果想要更優的效能,編寫出更好的演算法帶來的速度效益往往超過更換語言的速度效益

對此篇有興趣的歡迎指教,希望以後可以出更多IT相關文章