programing

PowerShell 어레이 초기화

closeapi 2023. 5. 11. 21:28
반응형

PowerShell 어레이 초기화

PowerShell에서 어레이를 초기화하는 가장 좋은 방법은 무엇입니까?

예를 들어, 코드는

$array = @()
for($i=0; $i -lt 5;$i++)
{
    $array[$i] = $FALSE
}

오류가 발생합니다.

Array assignment failed because index '0' was out of range.
At H:\Software\PowerShell\TestArray.ps1:4 char:10
+         $array[$ <<<< i] = $FALSE

여기 두 가지 방법이 더 있습니다. 둘 다 매우 간결합니다.

$arr1 = @(0) * 20
$arr2 = ,0 * 20

입력된 배열을 생성하려는 경우 생성자의 기본값을 사용할 수도 있습니다.

> $a = new-object bool[] 5
> $a
False
False
False
False
False

부울의 기본값은 명백히 거짓이므로 이는 당신의 경우에 효과가 있습니다.마찬가지로 입력한 int[] 배열을 만들면 기본값인 0이 됩니다.

어레이를 초기화할 때 사용하는 또 다른 멋진 방법은 다음과 같습니다.

> $a = ($false, $false, $false, $false, $false)
> $a
False
False
False
False
False

또는 범위를 초기화할 수 있는 경우 다음과 같이 유용한 경우가 있습니다.

> $a = (1..5)> $a12345

이것이 어느 정도 도움이 되었기를 바랍니다!

또 다른 대안:

for ($i = 0; $i -lt 5; $i++) 
{ 
  $arr += @($false) 
}

$arr이 아직 정의되지 않은 경우 이 작업이 작동합니다.

참고 - 이를 위한 더 나은(그리고 더 성능적인) 방법이 있습니다.아래의 https://stackoverflow.com/a/234060/4570 을 예로 들 수 있습니다.

배열이 비어 있으므로 원래 예제에서 오류를 반환한 다음 n번째 요소에 액세스하여 값을 할당하려고 합니다.

여기에는 많은 창의적인 답변들이 있는데, 이 게시물을 읽기 전에는 몰랐던 것들이 많습니다.작은 어레이의 경우 모두 문제가 없지만 n0번째에서 지적했듯이 성능에 상당한 차이가 있습니다.

여기서는 Measure-Command를 사용하여 각 초기화에 걸리는 시간을 확인합니다.예상할 수 있듯이 명시적 PowerShell 루프를 사용하는 모든 접근 방식은 사용하는 접근 방식보다 느립니다.넷 생성자 또는 PowerShell 연산자(IL 또는 네이티브 코드로 컴파일됨).

요약

  • New-Object그리고.@(somevalue)*n속도가 빠릅니다(100k 요소의 경우 약 20k 눈금).
  • 연산자가 " " " 인 n..m10배 더 느립니다(200k 눈금).
  • Add()는 baseline( ticks)보다 1000배 느리며, 가 지정된 을 사용하여 때와 로 method는 ticks)보다.for()또는ForEach-Objecta. (a.k.a.) (명일:foreach,%).
  • 추가대로 +=최악입니다(1000개 요소에 대해서만 2M 눈금).

전체적으로 array*n은 다음과 같은 이유로 "최고"라고 생각합니다.

  • 빠르네요.
  • 형식의 기본값뿐만 아니라 모든 값을 사용할 수 있습니다.
  • 값을 할 수 프롬프트에 합니다).(1..10)*10 -join " "또는('one',2,3)*3)
  • 테르세 구문.

유일한 단점:

  • 명백하지 않습니다.만약 여러분이 이 구조물을 전에 본 적이 없다면, 그것이 무엇을 하는지는 분명하지 않습니다.

그러나 어레이 요소를 어느 정도 값으로 초기화하려는 대부분의 경우 강력한 유형의 어레이가 필요합니다.든모작초하경으로 .$false그러면 어레이는 다른 것을 수용할 수 있습니까?$false또는$true 않다면, 그지않면다렇,면,New-Object type[] n최선의 접근 방식입니다.

테스트

기본 배열을 만들고 크기를 지정한 다음 값을 할당합니다.

PS> Measure-Command -Expression {$a = new-object object[] 100000} | Format-List -Property "Ticks"
Ticks : 20039

PS> Measure-Command -Expression {for($i=0; $i -lt $a.Length;$i++) {$a[$i] = $false}} | Format-List -Property "Ticks"
Ticks : 28866028

부울의 배열을 만드는 것은 객체의 배열을 만드는 것보다 약간 느립니다.

PS> Measure-Command -Expression {$a = New-Object bool[] 100000} | Format-List -Property "Ticks"
Ticks : 130968

이것이 무엇을 하는지는 명확하지 않습니다. New-Object에 대한 설명서에는 두 번째 매개 변수가 에 전달되는 인수 목록이라고만 나와 있습니다.넷 객체 생성자.배열의 경우 매개 변수는 분명히 원하는 크기입니다.

+=로 추가

PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt 100000; $i++) {$a+=$false} } | Format-List -Property "Ticks"

나는 그것이 완료되기를 기다리는 것에 지쳤기 때문에 ctrl+c는 다음과 같습니다.

PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt    100; $i++) {$a+=$false} } | Format-List -Property "Ticks"
Ticks : 147663
PS> $a=@()
PS> Measure-Command -Expression { for ($i=0; $i -lt   1000; $i++) {$a+=$false} } | Format-List -Property "Ticks"
Ticks : 2194398

(6 * 3)이 (6 + 6 + 6)과 개념적으로 유사한 것처럼 ($somearray * 3)은 ($somearray + $somearray + $somearray + $somearray)와 동일한 결과를 제공해야 합니다.그러나 어레이의 경우 +는 추가가 아닌 연결입니다.

$array+=$timeout이 느린 경우 $array*$n도 느린 것으로 예상할 수 있지만 다음과 같은 경우는 아닙니다.

PS> Measure-Command -Expression { $a = @($false) * 100000 } | Format-List -Property "Ticks"
Ticks : 20131

Java에 StringBuilder 클래스가 있는 것처럼 추가할 때 여러 개체를 만들지 않습니다. 따라서 PowerShell에 ArrayList가 있는 것 같습니다.

PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 1000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 447133
PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 10000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 2097498
PS> $al = New-Object System.Collections.ArrayList
PS> Measure-Command -Expression { for($i=0; $i -lt 100000; $i++) {$al.Add($false)} } | Format-List -Property "Ticks"
Ticks : 19866894

연산자, "는 " " 입니다.Where-Object 루프:

PS> Measure-Command -Expression { $a = 1..100000 } | Format-List -Property "Ticks"
Ticks : 239863
Measure-Command -Expression { $a | % {$false} } | Format-List -Property "Ticks"
Ticks : 102298091

주의:

  • 런 했습니다.$a=$null).
  • 테스트는 Atom 프로세서가 장착된 태블릿에서 수행되었습니다. 다른 컴퓨터에서 더 빠른 속도를 볼 수 있을 것입니다.[edit: 데스크톱 컴퓨터에서 약 2배 더 빠름.
  • 여러 번의 런을 시도했을 때 상당한 차이가 있었습니다.정확한 숫자가 아닌 크기의 순서를 찾습니다.
  • 테스트는 윈도우즈 8의 PowerShell 3.0을 사용했습니다.

승인

Array*n용 @halr9000, New-Object용 @Scott Sad 및 Lee Desmond, ArrayList용 @EBGreen 덕분입니다.

@n0rd 덕분에 성능에 대해 생각하게 되었습니다.

$array = 1..5 | foreach { $false }

여기 다른 아이디어가 있습니다.기억해야 해요, 기억해야 해요.아래의 NET:

$arr = [System.Array]::CreateInstance([System.Object], 5)
$arr.GetType()
$arr.Length

$arr = [Object[]]::new(5)
$arr.GetType()
$arr.Length

결과:

IsPublic IsSerial Name                                     BaseType                                                                                               
-------- -------- ----                                     --------                                                                                               
True     True     Object[]                                 System.Array                                                                                           
5
True     True     Object[]                                 System.Array                                                                                           
5

용사를 합니다.new()ISE에서 프로그래밍을 할 때 개체를 만들고 싶을 때 ISE가 모든 매개 변수 조합과 해당 유형에 대한 힌트를 제공합니다.그럴 필요 없어요New-Object변수의 유형과 순서를 기억해야 합니다.

새 개체에 대한 ISE IntelliSense

$array = @()
for($i=0; $i -lt 5; $i++)
{
    $array += $i
}

제가 찾은 솔루션은 New-Object cmdlet을 사용하여 적절한 크기의 어레이를 초기화하는 것이었습니다.

$array = new-object object[] 5 
for($i=0; $i -lt $array.Length;$i++)
{
    $array[$i] = $FALSE
}

앞의 크기를 모를 경우 배열 대신 배열 목록을 사용합니다.

$al = New-Object System.Collections.ArrayList
for($i=0; $i -lt 5; $i++)
{
    $al.Add($i)
}

여기 또 다른 일반적인 방법이 있습니다.

$array = for($i = 0; $i -le 4; $i++) { $false }

아니면 아이디어를 시도해 보세요.PowerShell 5.0+와 함께 작동합니다.

[bool[]]$tf=((,$False)*5)
$array = foreach($i in 1..5) { $false }

언급URL : https://stackoverflow.com/questions/226596/powershell-array-initialization

반응형